2016-06-19 2 views
0

schlug meinen Kopf auf diesem einfachen Datum Logik Problem Berechnung:Datum Logik-Puzzle: UTC entspricht gestern Ortszeit um 08.00 Uhr

Ich weiß, dass die Zeitzone des Benutzers zu UTC versetzt.

Mein Server ist in UTC. Es kennt jetzt die Zeit.

Wie berechne ich UTC Äquivalent von 'gestern Ortszeit um 8 Uhr'?

In JS habe ich versucht, dies zu tun, aber es scheint nicht ganz zu funktionieren.

var yesterday_am=moment(moment(new Date()).subtract(24,'hour')).format('YYYY-MM-DD'); // same local time previous day; 
// when is 8am local time in utc? 
var am=8 - (user.tz_offset/60); 
if (am<0) { yesterday_am=moment(yesterday_am).subtract(Math.abs(am), 'hour')}; 
if (am>0) { yesterday_am=moment(yesterday_am).add(am, 'hour')}; 

Zum Beispiel, wenn UTC 2016-01-10 0235 und Ortszeit ist -7 Stunden, würde es Ausgabe 2016-1-09 1500 (08.00 Uhr lokal).

+0

Ich dachte, das sollte ein arithmetisches Problem sein. Wo ist der Logikteil? – Mai

+0

Der logische Teil ist, ich weiß nicht, ob es ein logisches oder ein arithmetisches Problem ist. Die Berechnung zwischen Lokal und UTC verwirrt mich sehr. – metalaureate

+0

Könnten Sie ein Beispiel hinzufügen? Was sollte die Ausgabe sein, wenn die aktuelle UTC-Zeit "2016-01-10 0800" ist? – Rahul

Antwort

0

Dieser Code nicht bekannt DST (im Fall, wenn Sie nicht bereits basierend auf den Kommentaren unten heraus haben). Danke Maggie. Bitte beziehen Sie sich auf die vollständige Antwort von Maggie.

Sie können Sie versuchen, so etwas wie dieses

var localTime = moment.utc("2016-06-19").utcOffset('-07:00'); 
var utcAt8PrevDay = moment(localTime).subtract(1,'days').startOf('day').add(8, 'hour').utc(); 
+0

Perfekt. Ich hatte keine Ahnung, dass 'startOf' Methode verfügbar war! Genial! – metalaureate

+0

Dieser Code behandelt DST-Übergänge aus verschiedenen Gründen nicht und ist nicht die richtige Methode, um diese Berechnung mit Moment.js durchzuführen. Wenn der Offset heute -7 ist und der Offset gestern aufgrund von DST -8 war, wird dieser Code nicht funktionieren. Wenn die Uhr um 2 Uhr morgens "nach vorne springt", werden Sie nach 9 Stunden um 9 Uhr landen. –

+0

OP hat den Offset, also dachte ich, dass er den richtigen Offset haben wird (inklusive DST wenn anwendbar). Ist mein Verständnis nicht korrekt? Wenn nein, bitte hilf mir, es in DST aware zu ändern. Benütze ich stattdessen die Zeitzone? Danke für die Klarstellung. – Veeram

2

Die Logik tun unmöglich ist, auszuführen. Ohne die tatsächliche Zeitzone des Benutzers zu kennen, können Sie den UTC-Äquivalent von "gestern um 8 Uhr Ortszeit" nicht kennen. Sommerzeitübergänge können den Offset gestern gestern anders als den Offset heute machen. Weitere Informationen finden Sie unter time zone tag wiki, insbesondere Zeitzone! = Offset. Wenn Sie die Zeitzone des Benutzers kennen, können Sie diese Berechnung mit der Erweiterungsbibliothek moment timezone für Moment.js durchführen. Der Code würde wie folgt aussehen:

moment().tz('America/Los_Angeles').subtract(1, 'day') 
.set({hours:8, minutes:0, seconds:0, milliseconds:0}).utc() 

diesen Breaking down so macht es Sinn, wir folgende Dinge tun:

moment() //get the current time 
.tz('America/Los_Angeles') //put the moment in the Los Angeles time zone 
//the Los Angeles time zone is one of several that are UTC-7 right now 
.subtract(1, 'day') //go to yesterday 
.set({hours:8, minutes:0, seconds:0, milliseconds:0}) //set the time to exactly 8 am 
.utc() //convert back to UTC 

Sie zu Beginn des Tages 8 Stunden nicht hinzufügen. Dies wird 9 Uhr morgens sein, wenn die Uhren an diesem Tag "vorspringen", und 7 Uhr, wenn sie "zurückgefallen" sind.

Es klingt wie Ihr Code in Knoten auf dem Server ausgeführt wird. Wenn es im Browser läuft, dann weiß der Browser die Regeln Zeitzone des Benutzers, und man kann den folgenden Code verwenden, um die Zeit, um 8 Uhr gestern:

moment().subtract(1, 'day').set({hours:8, minutes:0, seconds:0, milliseconds:0}).utc() 

Dieser Code erfordert nicht die Zeit Zeitzone add weil der Browser die Zeitzonenregeln für die lokale Zeit des Benutzers kennt.

Wenn Sie die Zeitzone des Benutzers benötigen, haben Sie einige Optionen. Am zuverlässigsten ist es, einen Zeitzonenwähler zu verwenden, der in eine Karte integriert ist, damit der Benutzer auswählen kann. Es gibt einige davon im Internet.

Wenn Sie dies nicht tun möchten, können Sie die Funktion moment.tz.guess() verwenden, um eine Zeitzone zu erstellen, in der einige Heuristiken über die Zeitzone des Benutzers geschätzt werden. Diese Funktion ist gut, aber aufgrund der Einschränkungen des Browsers ist es unmöglich, sie zu 100% genau zu machen.

Für eine ganze Reihe von Informationen zum Umgang mit Datum, Uhrzeit und Zeitzonen in JavaScript können Sie versuchen, vor ein paar Monaten this talk I did at JavaScript MN.

Zusätzlich könnte Ihnen gefallen this really excellent Pluralsight course by Matt Johnson.

+0

Ich dachte ein einfaches 'neues Date(). GetTimezoneOffset()' würde sowohl Zeitzone als auch DST berücksichtigen. Warum ist das unmöglich? – Mai

+0

Weil das ist der Offset nur für diesen bestimmten Zeitpunkt. 'new Date()' gibt das aktuelle Datum und die Uhrzeit an, also 'new Date(). getTimezoneOffset()' gibt den * aktuellen * Offset. –

Verwandte Themen