2014-01-13 11 views
26

Ich bemerkte, dass für uns auf Eastern Time Zone ("Amerika/New_York") mit Zeitzone Offset von "-05: 00" Date.getTimezoneOffset() gibt positive Nummer von 300. Ich würde Offset in Minuten erwarten in Gebieten westlich von Utc negativ zu sein und in Gebieten östlich von Utc positiv zu sein, aber anscheinend ist es "fipped". Was ist der Grund für diese Entscheidung?Warum berücksichtigt JavaScript Date.getTimezoneOffset() "-05: 00" als positiven Offset?

http://momentjs.com/ folgt derselben Regel und gibt ...

moment.parseZone("01/13/2014 3:38:00 PM +01:00").zone() // == -60 
moment.parseZone("01/13/2014 3:38:00 PM -01:00").zone() // == 60 

Zugleich Datetime http://trentrichardson.com/examples/timepicker/ nicht Zahlen spiegeln, wenn seine anfängliche ‚Zeitzone‘ Parametereinstellung. Ist es falsch?

Antwort

43

Weil es so definiert ist. Unter Angabe des doc (MDN):

Der Zeitzonenversatz ist die Differenz in Minuten zwischen UTC und Ortszeit. Beachten Sie, dass der Offset positiv ist, wenn die lokale Zeitzone hinter UTC liegt und negativ ist, wenn sie voraus ist.

+4

Richtig, der Zeitzonen-Offset ist relativ zum lokalen. Wenn Sie beispielsweise in der Zone -01: 00 gelebt haben, ist UTC 60 Minuten vor Ihnen oder +60. – lemieuxster

+7

Die Frage in meinem Kopf ist, warum zur Hölle sie es so entworfen haben. – Andy

+1

@ Andy-weil das JavaScript-Date-Objekt eine Kopie des Java-Datumsobjekts war, Warzen und alle (sogar eine 2-stellige * getYear * -Methode). – RobG

9

ein bisschen auf raina77ow ist durchaus akzeptabel Antwort Ausarbeiten ...

Zuerst verstehen, dass die wichtigsten Normen hier beteiligt sind ISO 8601 und RFC 822 (und seine Verwandten 733, 1123 & 2822), die alle waren (in (Teil) abgeleitet von ANSI X3.51-1975.

Alle diese Standards verwenden die Konvention positiver Werte östlich von UTC/GMT und negative Werte westlich von UTC/GMT.

Der einzige Standard, der ich bin mir bewusst, dass hat, dass umgekehrt ist POSIX (siehe POSIX Abschnitt the timezone tag wiki und this article) und damit erklärt, warum die Abwärtskompatibilität Olson Zeitzonen wie „Etc/GMT + 5“ haben ihre Zeichen invertiert. (Natürlich ist es möglich, es gibt andere Verwendungen und ich bin mir nur nicht bewusst.)

Ob Sie es glauben oder nicht, JavaScript tut es beide Wege. Bei Verwendung als String (in der Syntax von RFC 822 oder ISO 8601) werden Stunden und Minuten mit positiven Offsets East von UTC verwendet. Aber wenn die getTimezoneOffset() Methode auf dem Date Objekt aufgerufen wird, gibt es ganze Minuten zurück, die positiv sind West von UTC.

Man kann nur spekulieren, warum diese Inkonsistenz existiert. Die ECMAScript spec ist voller solcher Probleme. Vielleicht liegt es daran, dass, wenn Sie einen Offset in einer ISO 8601 oder RFC 822 Zeichenfolge sehen, der Offset bereits angewendet wurde. Aber wenn Sie getTimezoneOffset() anrufen, ist es der Offset zu gelten, um es zurück zu UTC zu bringen.

Zum Beispiel ist 2014-01-01T00:00:00-05:00 gleich 2014-01-01T05:00:00Z. So würde getTimezoneOffset()300 zurückgeben. Wenn Sie dem ursprünglichen Wert 300 Minuten hinzufügen, kehren Sie zu UTC zurück.

Es ist zwei Seiten der gleichen Münze. Sehen?

In Bezug darauf, ob diese spezifische Kontrolle falsch ist oder nicht, bin ich mir nicht sicher. Ich kenne diese besondere Kontrolle nicht. Ich sehe in ihren Dokumenten das Beispiel von -0400, das gleich -240 ist, was man erwarten könnte, umgekehrt zu sein, aber andererseits ist es ein bisschen seltsam, einen Wert wie -240 einem Benutzer zu präsentieren. Wirklich, Sie sollten keine Offsets für einen Benutzer (IMHO) verfügbar machen. Es ist viel besser, ein Zeitzonenauswahlsteuerelement wie this one oder this one zu verwenden.

+0

Matt, ich war überrascht, dass die Offset-Struktur von Noda Time diesen Standards nicht entspricht. Dokumentation sagt, "Ein positiver Wert bedeutet, dass die lokale Zeit ist vor UTC (z. B. für Europa), ein negativer Wert bedeutet, dass die lokale Zeit ist hinter UTC (z. B. für Amerika)." http://nodatime.org/1.1.x/api/html/T_NodaTime_Offset.htm Ich habe gerade einen Fehler gemeldet, weil ich dachte, dass es das Gegenteil macht. – vkelman

+0

Ich verwende auch Moment.js und vergleiche Offsets, die von einer Zeichenfolge von Moment.parseZone() .zone() analysiert wurden (wie wir in einem anderen Post mit Ihnen besprochen haben http://goo.gl/9EaxG5), gegen den Offset von Noda Time, es ist ein bisschen chaotisch. – vkelman

+0

@vkelman - Ich bin mir nicht sicher, was Sie bekommen. Noda macht das Richtige. Es ist nur JavaScripts 'getTimeZoneOffset', das invertiert ist. Moment behandelt entweder Form, verwendet JS (positiv nach Westen), wenn Zahlen übergeben werden, oder verwendet den ISO-Weg (positiv nach Osten), wenn es als String übergeben wird. Siehe [dieser Teil der Momentdokumente] (http://momentjs.com/docs/#/manipulating/timezone-offset/) –