2015-10-01 8 views
8

Ich stehe vor einem Problem, das versucht, moment.js für den Umgang mit Zeitversätzen zu verwenden.Aktualisiere Zeitverschiebung mit Moment(). UtcOffset()

sammle ich in einem versteckten Eingang der lokalen Benutzerzeitversatz:

<script type="text/javascript"> 
    $(document).ready(function() { 
    $('input#timeoffset').val(moment().utcOffset()); 
    }); 
</script> 

Der Offset korrekt gespeichert wird (in meinem Fall sein Wert -240). Später auf der Serverseite (die UTC-Zeit läuft) Ich versuche, einige db zu aktualisieren gespeichert utcDate tun so etwas wie:

var userDate = moment(utcDate).utcOffset(offset) 

Mein Problem ist folgendes: , wenn ich meinen Code ausführen, wie oben beschrieben ich keine Effekte erhalten :

  • utcDate: 20151001 012421 +0000
  • userDate: 20151001 012421 +0000

Wenn ich den Offset-Zeichen Flip ich:

  • utcDate: 20151001 012421 +0000
  • userDate: 20151001 052421 +0400

ich eindeutig falsch, etwas zu tun habe (auch wenn meine Erwartung war, dass die erste Version korrekt war), Sie haben keine Andeutung?

Auf Client-Seite Ich bin moment.js v2.10.6, während auf der serverseitigen Moment-timezone.js v0.4.0 und moment.js v2.10.6

+0

Und was machen Sie mit 'userDate', nachdem Sie den Offset angewendet haben? Wahrscheinlich rufen Sie 'toDate',' valueOf', 'unix' oder andere Methoden auf, die eher die Instant- als die Wall-Zeit widerspiegeln. –

+0

Denken Sie auch an "Zeitzone! = Offset".Wenn Sie den * aktuellen * Offset des Benutzers speichern und ihn später auf einen beliebigen Zeitpunkt anwenden, ist dies möglicherweise der falsche Offset für diese Zeit. Zeitzonen können Offsets für die Sommerzeit und aus verschiedenen anderen Gründen ändern. –

+0

@MattJohnson eigentlich ich nur '.format (...)', um die Ergebnisse auszudrucken. Die Ergebnisse, die ich oben berichtet habe, werden gedruckt: 'console.log ('utcDate:' + moment (utcDate) .format ('JJJJMMTT HHmmss ZZ')); console.log ('userDate:' + Moment (UtcDate) .utcOffset (Offset) .format ('JJJJMMTT HHmmss ZZ')); '. Das 'utcDate' ist ohne Offset. – Pierluigi

Antwort

10

Das Hauptproblem ist, dass Sie Übergeben des Versatzes als Zeichenfolge anstelle einer Zahl.

moment.utc("2015-10-01 01:24:21").utcOffset("-240").format('YYYYMMDD HHmmss ZZ') 
// "20151001 012421 +0000" 

moment.utc("2015-10-01 01:24:21").utcOffset(-240).format('YYYYMMDD HHmmss ZZ') 
// "20150930 212421 -0400" 

Wenn Sie einen Offset in Minuten haben, müssen Sie das numerische Formular verwenden. Sie können es immer konvertieren:

moment.utc("2015-10-01 01:24:21").utcOffset(+"-240").format('YYYYMMDD HHmmss ZZ') 
// "20150930 212421 -0400" 

Moment erlaubt für Offsets als Strings übergeben werden, aber es erwartet, dass sie in einer der ISO8601-Formate sein: entweder [+/-]HH:mm oder [+/-]HHmm.

moment.utc("2015-10-01 01:24:21").utcOffset("-04:00").format('YYYYMMDD HHmmss ZZ') 
// "20150930 212421 -0400" 

Zusätzlich beachten Sie, dass ich moment.utc(...) verwendet, um die Eingabezeichenfolge zu analysieren. Sie haben gerade moment(...) verwendet, das die lokale Zeitzone verwendet, es sei denn, die Zeitzone ist explizit oder wenn Sie ein Date-Objekt anstelle einer Zeichenfolge übergeben. Es wird auch das moment Objekt im "lokalen Modus" belassen, so dass Ihre utcDate Ausgabe falsch wäre, es sei denn, die Zeitzone der Maschine wurde tatsächlich auf UTC gesetzt.

Zuletzt "Zeitzone! = Offset" nicht vergessen. Sie können nicht davon ausgehen, dass der von Ihnen erhaltene Offset für alle Daten gültig ist. Wenn Sie ein Datum in die Zeitzone des Benutzers projizieren müssen, müssen Sie die Zeitzone kennen, z. B. America/New_York. Sie können diese mit dem Moment-Zeitzonen-Plugin verwenden.

+0

Ich habe gerade herausgefunden, dass das genau mein Fehler ist, ich habe nicht 'parseInt' und ich war verwirrt, dass es in einer Richtung funktioniert und nicht in der anderen, während 'offset' eine Zeichenkette ist! Vielen Dank! – Pierluigi