moment.js Zeitzonen .valueOf () - nicht wieder die erwarteten Werte
Habe ich eine eckige Anwendung mit highcharts-ng, um eine Linie graph. Die y-Achse die zahlen und die x-Achse ist datetime ist.
Ich versuche, ordnungsgemäß Konto für die Sommerzeit änderungen, die bei der Umwandlung zwischen zwei Zeitzonen von der "Amerika/New_York" und "Europa/London" mit moment.js.
London ist derzeit in BST (zum Zeitpunkt der Veröffentlichung dieses), es ist also +1:00.
tick.TimeStamp
> "2015-04-21T16:06:06.0786392-04:00"
tick.TimeStamp ist mein "Amerika/New_York" Zeit (derzeit in der EDT). Ich konvertieren, dass zu Zeit für London mit...
moment(tick.TimeStamp).tz("Europe/London").format()
> "2015-04-21T21:06:06+01:00"
Brauche ich mein Ergebnis in Unix-Epoche Zecken zeichnen Sie für die x-Achse in highcharts-ng, also ich benutze...
var d = moment(tick.TimeStamp).tz("Europe/London").format()
moment(d).valueOf()
ergibt
1429646766000
Das Problem ist, dass diese tick-Wert als Ergebnis ein datetime ist
Tue, 21 Apr 2015 20:06:06 GMT
wo es sein sollte
Tue, 21 Apr 2015 21:06:06 GMT
seit London ist derzeit in BST +1:00
Mache ich etwas falsch, oder ist im moment nur die Berechnung falsch?
Jegliche Hilfe würde sehr geschätzt werden. Danke!
EDIT: ich sollte erwähnen, dass mein moment-timezones.js ist der jüngste von Ihrer Website, die mit allen timezone info.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Moment ist die Berechnung korrekt.
Tue, 21 Apr 2015 20:06:06 GMT
,Tue, 21 Apr 2015 21:06:06 BST
, undTue, 21 Apr 2015 16:06:06 EDT
beziehen sich alle auf die gleiche Zeit und alle haben den gleichen unix-timestamp. Wenn Sie anrufen.tz()
Sie nur ändern, wie diese formatiert werden. Sie ändern sich nicht die tatsächliche Zeit.Anmerkung: Um den unix-Zeitstempel, die Sie verwenden können
.unix()
z.B.Oder wird dies wieder den gleichen Wert
moment(tick.TimeStamp).valueOf()
funktionieren würde, wenn er muss den timestamp in Millisekunden statt Sekunden. Sie sind richtig, dasstz
ist überflüssig und unnötig für diesen Zweck.Habe ich aktualisiert, ein JS-fiddle eine Probe geben. http://jsfiddle.net/x0z90vqg/ (Aktualisiert fiddle zeigt
type
Eigenschaft auf x-Achse, wenn nicht mit HighStock)Ich glaube, dein Problem ist, dass Sie nicht mit der Highcharts Globale Objekt's Eigenschaften useUTC und timezoneOffset Eigenschaften entsprechend. Mit der
highcharts-ng
- control-Masken, die einige der Funktionen der Highcharts-Bibliothek, aber Sie sind immer noch in der Lage, den Zugriff auf die Funktionen, die Sie brauchen, ziemlich leicht.Das entsprechende Stück der Geige ist:
Das obige Beispiel setzt den Highcharts Globale Objekt nicht UTC verwenden für die Datum/Zeit-Serie und set ist der offset auf -5 Stunden (Sie erhalten die erforderlichen offset mit der moment.js wie Sie bereits sind) und dann erzählen, das Diagramm neu zu zeichnen, durch die
highcharts-ng
's ausgesetztgetHighcharts()
Methode. Diese Methode gibt den aktuellen Diagramm-Objekt und von dort aus es ist wie du bist mit highcharts direkt und nicht über Zwischenhändler Komponente.Bearbeiten
@Matt brachte einen sehr guten Punkt. Einstellung der timezoneOffset wie dieser ist nicht ganz die gleiche Sache wie das festlegen einer wahren Zeitzone. Eine wahre Zeitzone berücksichtigen Sommerzeit-änderungen und solche, dies ist nur ein statischer offset von UTC. Die Einstellung der UTC-Abweichung, wie auch dies wirkt sich auf die gesamte Grafik, nicht nur eine Reihe. Wenn erforderlich, dass Sie die Anzeige (und den Vergleich) von zwei oder mehr Serien auf der gleichen Grafik in verschiedenen Zeitzonen, und anzeigen, dass Daten wie Ihre jeweiligen Zeitzonen, können Sie mehrere X-Achse und in der format-label-Logik für jede Achse, nehmen den X-Wert für den tick und wandeln es über die javascript-Funktion in der Zeitzone würde, Wert und Bezeichnung, die Sie anzeigen möchten. Dies sollte dazu führen, dass zwei-X-Achse mit labels in zwei unterschiedlichen Zeitzonen, aber die Daten im zentralen Teil der Grafik aus der gleichen UTC-Skala. Wenn Sie dies tun, würden Sie wahrscheinlich auch wollen, überschreiben Sie die formatter-für die tool-Tipp-popup, so dass Sie konvertieren können den angezeigten Wert in der QuickInfo zum anzeigen der Zeitzone würde Wert für jeden Punkt, wenn Sie nicht wollen, dass es zur Anzeige von UTC.
Alle dies immer noch nicht das problem lösen, die die Anzeige einer Zeitreihe von Daten, die Kreuze über der Stelle, wo DST-Schalter. Ich glaube nicht, dass Highcharts hat keine Möglichkeit der Vertretung, und ich bin mir nicht bewusst von anderen charting-Bibliothek, die spielt entweder. Es scheint so, als wäre es ein relativ Häufig auftretendes problem aber, so bin ich sicher, dass es gelöst wurde, irgendwo...
xAxis: { type:'datetime' }
gerade posten wollte ein kurzes update, was ich herausgefunden.
Da lief ich zu viele Macken, die versuchen dies zu tun auf der client-Seite, ich fand eine nette Art und Weise zu behandeln, diese auf der server-Seite in meine Controller-code (.NET). Statt der Rückgabe nur die timestamp (ankreuzen.TimeStamp), habe ich jetzt wieder EasternTimeStamp und LondonTimeStamp. Ich war in der Lage, dies zu erreichen, mit eine schöne Methode aus der TimeZoneInfo-Klasse.
Hoffentlich wer läuft in dieser Ausgabe finden diese nützlich. Ich habe festgestellt, dass es sehr anstrengend sein versuchen zu finden ein schöner Weg, um mit der Sommerzeit-und Zeitzonen wie in der letzten Woche.