Moment: Zeitzonenabkürzung von Date.prototype.toString () konnte nicht gefunden werden

Erstellt am 6. Feb. 2012  ·  33Kommentare  ·  Quelle: moment/moment

Hallo, ich bin über ein Forum auf die Website moment.js gestoßen und habe mich durch diese geklickt, als ich auf den Komponententest gestoßen bin - der 2 Tests nicht bestanden hat, was ich hier berichten möchte:

User-Agent:
Mozilla / 5.0 (Windows NT 6.1; WOW64) AppleWebKit / 535.7 (KHTML, wie Gecko) Chrome / 16.0.912.77 Safari / 535.7 (Chrome 16.0.912.77 m)

Zeitzone:
UTC + 1

Fehlgeschlagene Tests (# 28):
http://pastebin.com/bQsDuxdH

* Titel bearbeitet von Timrwood

Bug

Hilfreichster Kommentar

Dumme Frage: Warum eine völlig neue Bibliothek? Ist es nicht der richtige Zeitpunkt, alle Anforderungen an Datum und Uhrzeit zu erfüllen? Während die Datendateien eine nicht triviale Menge an Speicherplatz hinzufügen (und ich kann verstehen, dass sie getrennt werden), ist die neue Bibliothek selbst <2 KB groß, sodass Speicherplatz kein Grund für die Trennung zu sein scheint.

Es ist nur traurig, dass jemand, der einfach eine Datumszeichenfolge mit einer Zeitzone generieren möchte, zwei separate Bibliotheken und eine Datendatei herunterladen muss, um das zu tun, was Javascript integriert haben sollte.

Wie verwende ich diese neue Zusammenführung von Bibliotheken, um eine einfache Datumszeichenfolge zu generieren? Bevor ich hätte generieren können:

Sun, 06 Nov 1994 08:49:37 GMT

mit:

moment().format('ddd, DD MMM YYYY HH:mm:ss z');

Aber jetzt bin ich verwirrt, wie ich das ohne die Formatierungsoption "z" machen soll. Jede Hilfe wäre dankbar.

Alle 33 Kommentare

Hmm, es sieht so aus, als ob die Zeitzonenabkürzung fehlschlägt. Es tut uns leid, Remote-Debugging durchzuführen, aber was ist die Ausgabe der folgenden in Chrome?

new Date().toString()

Wie heißt die Zeitzone, in der Sie sich befinden?

Ich erhalte den gleichen Fehler in den Unit-Tests und bin auch in UTC + 1 (früher bekannt als GMT + 1).

new Date (). toString () druckt "Sa 11.02.2012 02:15:10 GMT + 0100" in Firefox 10, "Sa 11.02.2012 02:18:29 GMT + 0100 (W. Europe Standard Time)" in Chrome 16 und "Sat Feb 11 02:18:59 UTC + 0100 2012" in Internet Explorer 9

Hmm, ich hatte Angst davor. Das Problem ist, dass Date.prototype.toString so unterschiedliche Ergebnisse zurückgibt. Dies ist der einzige Ort, an dem der Zeitzonenname (PST, CST, EST usw.) abgerufen werden kann. Wenn diese Methode keine Zeitzoneninformationen zurückgibt (wie dies bei FF10 und IE9 der Fall ist, gibt es keine Möglichkeit, diese abzurufen.

Vielleicht ist es Zeit, abzuschreiben? Oder ist es akzeptabel, das Problem nur in den Dokumenten zu vermerken?

4318 bestanden, 2 fehlgeschlagen. 2715 Millisekunden.

Mozilla / 5.0 (Windows NT 6.1) AppleWebKit / 535.11 (KHTML, wie Gecko) Chrome / 17.0.963.56 Safari / 535.11

UTC +2 (Kiew, Ukraine)

Format Zeitzone 2 bestanden, 2 fehlgeschlagen.
---> So etwas wie "PST"
AssertionError: ---> So etwas wie "PST"
at Object.ok (http://momentjs.com/js/tests.js?_=120203_183019:1526:39)
unter http://momentjs.com/js/tests.js?_=120203_183019:2413:14
at Object.runTest (http://momentjs.com/js/tests.js?_=120203_183019:1702:9)
unter http://momentjs.com/js/tests.js?_=120203_183019:1748:25
unter http://momentjs.com/js/tests.js?_=120203_183019:1006:13
unter http://momentjs.com/js/tests.js?_=120203_183019:616:13
unter http://momentjs.com/js/tests.js?_=120203_183019:627:25
unter http://momentjs.com/js/tests.js?_=120203_183019:1008:17
unter http://momentjs.com/js/tests.js?_=120203_183019:1589:17
---> So etwas wie "PST"
AssertionError: ---> So etwas wie "PST"
at Object.ok (http://momentjs.com/js/tests.js?_=120203_183019:1526:39)
unter http://momentjs.com/js/tests.js?_=120203_183019:2414:14
at Object.runTest (http://momentjs.com/js/tests.js?_=120203_183019:1702:9)
unter http://momentjs.com/js/tests.js?_=120203_183019:1748:25
unter http://momentjs.com/js/tests.js?_=120203_183019:1006:13
unter http://momentjs.com/js/tests.js?_=120203_183019:616:13
unter http://momentjs.com/js/tests.js?_=120203_183019:627:25
unter http://momentjs.com/js/tests.js?_=120203_183019:1008:17
unter http://momentjs.com/js/tests.js?_=120203_183019:1589:17
+02: 00 ---> So etwas wie "+07: 30"
+0200 ---> So etwas wie "+0700"

Ich bekomme auch den gleichen fehlgeschlagenen Test # 28. Meine Zeitzone ist GMT -3.

Agent:
Mozilla / 5.0 (Windows NT 6.1; WOW64) AppleWebKit / 535.11 (KHTML, wie Gecko) Chrome / 17.0.963.66 Safari / 535.11

Fehlgeschlagener Test: http://pastebin.com/dsWHMF3h

.:.

Agent:
Mozilla / 5.0 (Windows NT 6.1; WOW64; rv: 10.0.2) Gecko / 20100101 Firefox / 10.0.2
oder
Mozilla / 5.0 (kompatibel; MSIE 9.0; Windows NT 6.1; WOW64; Trident / 5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4. 0C; Zune 4.7; .NET4.0E)

Fehlgeschlagener Test: http://pastebin.com/6t6JP9fu

Es sieht also so aus, als ob dies in UTC + 1, UTC + 2 und UTC-3 geschieht.

Leider gibt es jetzt eine Möglichkeit, dies zu beheben. Es hängt davon ab, ob die Ausgabe von Date().toString() gehackt wird. Wenn in dieser Zeichenfolge keine Zeitzoneninformationen verfügbar sind, gibt es keine Möglichkeit, diese Informationen abzurufen.

Ich werde diese Funktion abwerten und vielleicht ein Plugin erstellen, das zuverlässigere (wenn auch weniger genaue) Ergebnisse liefert. Es sollte wahrscheinlich so etwas wie https://github.com/mde/timezone-js sein.

Die z zz Token werden ab 1.6.0 nicht mehr unterstützt. Ich schließe dieses Problem als Ergebnis.

Was ist mit node.js? Sind z zz zuverlässig oder nicht in dieser Umgebung?

Sie sind offiziell veraltet, daher funktionieren sie ab Version 1.6.0 nicht mehr.

Bei früheren Codeversionen stelle ich mir vor, dass die Ergebnisse ebenfalls inkonsistent sind, da Node V8 verwendet und einige der oben genannten inkonsistenten Ergebnisse in Chrome verwendet werden, das auch V8 verwendet.

Vielen Dank. Für eine Zeichenfolge wie Thu Jan 10 2013 22:54:11 GMT+0100 (CET) ich am Ende die Zeitzonenzeichenfolge (hier (CET) mit dem führenden Leerzeichen) mit einem regulären Ausdruck entfernt und nur die Timeshift-Informationen (hier +0100 ) belassen

Hmm, ich bin mir nicht sicher, was Sie versuchen, versuchen Sie, CET oder +0100 ?

+0100 wird über das Token ZZ (Groß- und Kleinschreibung beachten) unterstützt und funktioniert beim Parsen und Formatieren einwandfrei.

CET war veraltet, da wir es nicht zuverlässig von Date.toString . Da wir jedoch Date.getTimezoneOffset für +0100 , ist die Unterstützung viel konsistenter.

Ich mache, wie Sie sagen, ZZ für +0100 und entferne CET aus dem String, um es zu analysieren. Macht das Sinn ?

Ich entschuldige mich, ich verstehe immer noch nicht, wo das Problem liegt. Versuchen Sie, Thu Jan 10 2013 22:54:11 GMT+0100 (CET) zu analysieren? Sie sollten in der Lage sein, Folgendes zu tun.

moment('Thu Jan 10 2013 22:54:11 GMT+0100 (CET)', 'ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');

Genau das mache ich am Ende. Sie bestätigen anscheinend, dass ich das Richtige tue. Ich entschuldige mich Wenn ich nicht klar war, danke für die Antworten!

Kein Problem!

@ hughanderson4 , das Problem war, dass Browser nicht immer eine Zeitzonenabkürzung von Date.prototype.toString . Da wir die Zeitzonenabkürzung nicht zuverlässig erhalten konnten, war sie veraltet.

Seitdem wurde eine Moment-Zeitzone erstellt, um die Zeitzonenunterstützung für moment.js hinzuzufügen. Vielleicht möchten Sie sich das ansehen, um zu sehen, ob es Ihren Anforderungen entspricht.

Wie würde man eine moment.utc () in Ortszeit konvertieren und die Zeitzonenabkürzung anzeigen?

Dumme Frage: Warum eine völlig neue Bibliothek? Ist es nicht der richtige Zeitpunkt, alle Anforderungen an Datum und Uhrzeit zu erfüllen? Während die Datendateien eine nicht triviale Menge an Speicherplatz hinzufügen (und ich kann verstehen, dass sie getrennt werden), ist die neue Bibliothek selbst <2 KB groß, sodass Speicherplatz kein Grund für die Trennung zu sein scheint.

Es ist nur traurig, dass jemand, der einfach eine Datumszeichenfolge mit einer Zeitzone generieren möchte, zwei separate Bibliotheken und eine Datendatei herunterladen muss, um das zu tun, was Javascript integriert haben sollte.

Wie verwende ich diese neue Zusammenführung von Bibliotheken, um eine einfache Datumszeichenfolge zu generieren? Bevor ich hätte generieren können:

Sun, 06 Nov 1994 08:49:37 GMT

mit:

moment().format('ddd, DD MMM YYYY HH:mm:ss z');

Aber jetzt bin ich verwirrt, wie ich das ohne die Formatierungsoption "z" machen soll. Jede Hilfe wäre dankbar.

Fragen Sie also nur, um sicherzugehen, dass ich verstehe: Es gibt keinen Ersatz für das veraltete 'z'-Format?

Wenn ich einen Zeitstempel im ISO-8601-Format habe, wie z.

2014-07-25T18:00:00-04:00

Und ich möchte diesen Zeitstempel wie folgt anzeigen:

6:00 PM EST

Unterstützt moment diese Formatierung nicht mehr? Alle Zeitzonendaten sind in meinem Zeitstempel enthalten, und ich möchte sie nur direkt anzeigen, ohne die Zeitzone in irgendeiner Weise zu verändern.

Das schließt die Zeitzone nicht ein. Es kann mehrere Zeitzonennamen geben, die demselben UTC-Versatz entsprechen, insbesondere wenn die Möglichkeiten einer Variation der Sommerzeit berücksichtigt werden. Sie können aus "UTC-4: 00" nicht schließen, dass die Zeitzone EST ist.

Zur Verdeutlichung funktioniert der Formatierer z weiterhin, wenn die Moment-Zeitzone mit einer bestimmten Zone verwendet wird, da die Abkürzung aus den Zeitzonendaten abgerufen werden kann.

Erwähnen Sie dies jetzt - wenn Sie verwenden
new Date().toTimeString()
Soweit ich es versucht habe, erhalten Sie in allen Browsern das gleiche Ergebnis.

Dies bedeutet, dass Sie möglicherweise diese Zeichenfolge verwenden könnten, um die Zeitzone zu extrahieren, nicht wahr?

Hallo, ich sehe oben, dass das Format ('z') veraltet ist. auch in moment docs sehe ich, dass es von 1.6.0 veraltet ist. Ich verwende jetzt 2.11.0. Ich kann das 'z' verwenden, um die Zeitzone (PST / PDT) basierend auf dem Offset anzuzeigen.
Sollte ich dieses 'z' jetzt nicht in meinem Code verwenden? Können Sie bitte eine genaue Alternative zur Anzeige von PST anstelle von - / + 8 angeben?

@themakshter - nein, Sie erhalten nicht in allen Browsern das gleiche Ergebnis. Betriebssystem, Browserversion und Sprache spielen eine große Rolle - und es gibt keine Konsistenzanforderungen in der Spezifikation.

@ Shobana16 - Wenn Sie nur moment().format('z') , wird immer "" .

Wenn Sie die Moment-Zeitzone verwenden und so etwas wie moment.tz('America/Los_Angeles').format('z') ausführen, erhalten Sie eine gültige Antwort.

z ist in Ordnung mit Moment-Zeitzone. Es tut nichts in einem einfachen Moment.

Vielen Dank für die Kommentare MJ. Ja, ich benutze 'z' nur mit Moment-Zeitzone. Ok cool bleibt mein Code mit 'z'. !

Nur eine Anmerkung zum Hinzufügen, ab Moment-Zeitzone 0.5.0 können Sie die lokale Zeitzone erraten, die die Tür öffnet für:

var abbreviation = moment.tz(moment.tz.guess()).format('z');

Dies ist in Ordnung, aber beachten Sie Folgendes:

  1. Es ist nur eine Vermutung. Es könnte falsch raten.
  2. Wenn es falsch geraten wird, besteht immer noch die Möglichkeit, dass die Abkürzung korrekt ist, da viele ähnliche Zeitzonen dieselben Abkürzungen verwenden, z. B. wie Europe/Paris und Europe/Berlin beide CET und CEST .
  3. Es gibt jedoch keine Garantien. Wenn es falsch vermutet wird, können Sie die falsche Abkürzung angeben.

Wir könnten auch in Betracht ziehen, moment.js so anzupassen, dass, wenn moment-timezone verfügbar ist, dies automatisch versucht werden könnte, um den Formatierer z wieder zu aktivieren. Dies geschieht derzeit jedoch nicht.

var abbreviation = moment.tz(moment.tz.guess()).format('zz'); scheint nicht zu funktionieren (mit zwei z s). Kann ich nur "EDT" und nicht "Eastern Daylight Time" abrufen?

Vielen Dank!

Ahhh, ich habe festgestellt, dass http://momentjs.com/timezone/docs/#/using -timezones / formatating / sagt: Um lange Formularnamen bereitzustellen, können Sie moment.fn.zoneName überschreiben und zz Token.
[and much more...]
Vielen Dank.

Eines ist jedoch verwirrend. In der aktuellen Version (oder wie angegeben "ab 1.6.0 ") gibt es keine Möglichkeit, die Zeitzone moment(...).toString() mache, zeigt es am Ende zum Beispiel GMT . Handelt es sich also um einen Fehler oder widerspricht eine Lösung einer anderen Funktionalität?

Eines ist jedoch verwirrend. In der aktuellen Version (oder wie angegeben "ab 1.6.0 ") gibt es keine Möglichkeit, die Zeitzone moment(...).toString() mache, zeigt es am Ende zum Beispiel GMT . Handelt es sich also um einen Fehler oder widerspricht eine Lösung einer anderen Funktionalität?

Ich denke, das Problem ist die Zuverlässigkeit. Moment kann die korrekte Zeitzone nicht zuverlässig aus dem lokalen Datumsobjekt extrahieren, sodass die Formatierung von z/zz nicht mehr unterstützt wird.

Oben diskutiert:
https://github.com/moment/moment/issues/162#issuecomment -4060027

Dies hat für uns funktioniert, um den "GMT" -Text zu erhalten, da z veraltet ist

const dateGenerated = moment("2020-05-20 08:15:25");
const localDateGenerated = dateGenerated.local().format('DD MMM YYYY hh:mm A') + ' ' + String(dateGenerated.local()._d).split(' ')[5];

Es wird 20 May 2020 08:15 AM GMT+0300" generiert

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen