<p>moment.utc (string) analysiert ISO8601 als Ortszeit, wenn die Zeitzone fehlt</p>

Erstellt am 12. Apr. 2012  ·  24Kommentare  ·  Quelle: moment/moment

Hilfreichster Kommentar

Ich muss den Ausdruck der Verwirrung über die UTC-Funktionalität verstärken. Die intuitivste Erwartung von moment.utc () wäre, dass es ein Moment-Objekt zurückgibt, das das aktuelle Datum / die aktuelle Uhrzeit in UTC-Zeit darstellt. Aber nach dieser Diskussion ist es nicht der Fall und es setzt nur die Flagge. Es ist immer noch unklar, was diese Flagge bewirkt. Nichts davon wird in der Dokumentation erwähnt, was es absolut unzureichend macht. Bitte fügen Sie Ihrem Rückstand eine Erläuterung dieses Themas mit Beispielen hinzu. Vielen Dank.

Alle 24 Kommentare

moment.utc (string) analysiert ISO8601 als Ortszeit, wenn die Zeitzone fehlt

So sagt ISO8601 ... und EcmaScript 6

Ich denke, das gilt ziemlich gut für moment(string) , aber wenn Sie moment.utc(string) , ist die Implikation, dass Sie möchten, dass es als UTC analysiert wird.

moment('2010-10-20T08:40'); // should parse to local time
moment.utc('2010-10-20T08:40'); // should parse to utc time

Ich habe ein Problem, das meiner Meinung nach damit zusammenhängt:

Ich versuche, dieses Datum zu konvertieren: 12-04-2012 (TT-MM-JJJJ, in UTC) in seinen Unix-Zeitstempel.
Ich mache das:

var date = '12-04-2012';
var mm = moment().utc( date, "DD-MM-YYYY" );
console.log( mm.valueOf() );

Dies gibt einen falschen Zeitstempel aus: 1334670827391 .
Wenn ich es versuche:

console.log( mm.format('DD-MM-YYYY') );

Es übertrifft: 17-04-2012

a538306 behebt dies. Wird in 1.6.0 ausgehen

Ich sehe dieses Problem immer noch in der neuesten Version.

Ich gebe Folgendes ab: moment.utc ('2012-12-14T00: 29: 40.276Z') und erhalte: {_d: Do 13.12.2012 18:29:40 GMT-0600 (Central Standard Time), _isUTC: true (Do 13.12.2012 18:29:40 GMT-0600 (Zentrale Standardzeit)) .. Es wird nicht die UTC-Zeit verwendet, sondern meine lokale Zeitzone.

Das bekomme ich mit 1.7.2 .

moment.utc('2012-12-14T00:29:40.276Z').format(); // "2012-12-14T00:29:40+00:00"

Folgendes passiert für mich (neueste Version), wenn ich in Chrom auf die Konsole schreibe:

console.log (moment.utc ('2012-12-14T00: 29: 40.276Z'));
console.log (moment.utc ('2012-12-14T00: 29: 40.276Z'). format ());
console.log (moment.utc ('2012-12-14T00: 29: 40.276Z'). toDate ());

H {_d: Do 13.12.2012 18:29:40 GMT-0600 (Central Standard Time), _isUTC: true, _a: Array [8], _lang: false, clone: ​​function…}

2012-12-14T00: 29: 40 + 00: 00

Do 13.12.2012 18:29:40 GMT-0600 (Zentrale Standardzeit)

Sollte es nicht ein neues Datum in utc erstellen (keine Zeitzone)? Auch das erste console.log zeigt das Moment-Objekt mit einer cst-Zeitzone und nicht mit seiner utc-Zeit.

Thu Dec 13 2012 18:29:40 GMT-0600 ist genau die gleiche Zeit wie 2012-12-14T00:29:40.276Z . Es handelt sich lediglich um verschiedene Arten der Anzeige derselben Zeit. Wenn Sie möchten, können Sie dies folgendermaßen sehen.

console.log(moment.utc('2012-12-14T00:29:40.276Z').toDate().toString());
// Thu Dec 13 2012 16:29:40 GMT-0800 (PST)
console.log(moment.utc('2012-12-14T00:29:40.276Z').toDate().toUTCString());
// Fri, 14 Dec 2012 00:29:40 GMT

Das native JS Date hat keinen utc vs local-Modus, sondern nur Accessoren wie getUTCHours und getHours .

Moment.js abstrahiert diese getUTC* vs get* Methoden mit der Idee des utc-Modus und des lokalen Modus. Wenn sich der Moment im utc-Modus befindet, werden die Methoden getUTC* verwendet. Wenn es sich im lokalen Modus befindet, werden die Methoden get* verwendet.

Danke für die Klarstellung.

Ich hatte erwartet und dachte, dass sinze der ISO-Standard besagt, dass Z keine Zeitzone bedeutet, die standardmäßig utc wäre. Wenn Sie also moment.utc ('2012-12-14T00: 29: 40.276Z') oder moment ('2012-12-14T00: 29: 40.276Z') ausführen, werden beide als utc und das utc-Flag behandelt auf true setzen.

PS, tut mir leid, dass ich dich so sehr gestört habe :. Ich erstelle eine neue Diskussion für eine andere Frage: s

Kein Problem.

Der Grund, warum wir das isUTC -Flag nicht mit moment() und moment.utc() ist, dass Sie möglicherweise die Zeichenfolge anzeigen möchten, obwohl Sie möglicherweise eine UTC + 0-Zeichenfolge analysieren Moment in der Zeitzone des Benutzers.

Dies ist ein ziemlich häufiger Anwendungsfall, da es empfehlenswert ist, Zeiten als ISO8601 UTC + 0-Zeichenfolgen im Backend zu speichern und im Frontend in der Zeitzone des Benutzers anzuzeigen.

Danke, ich hoffe, jemand anderes findet diese Diskussion auch hilfreich.

Wenn ich console.log (moment.utc ()) ausführe, wird "Fri Jan 18 2013 16:25:32 GMT-0800 (UTC)" gemeldet. Dies ist jedoch die lokale pazifische Zeit, NICHT die aktuelle UTC-Zeit. Da beim Protokollieren explizit (UTC) steht, gehe ich davon aus, dass "16:25:32" in UTC-Zeit ist, aber es ist tatsächlich lokale Pazifikzeit ...

Außerdem gehe ich davon aus, dass moment.utc (). ValueOf () die Anzahl der Millisekunden in UTC seit der Epoche zurückgibt, was falsch zu sein scheint. Haben Sie etwas von diesem Verhalten gesehen?

console.log (moment ())
H {_d: Fri Jan 18 2013 16:51:20 GMT-0800 (UTC), _isUTC: false, _a: null, _lang: false}
console.log (moment.utc ())
H {_d: Fri Jan 18 2013 16:51:20 GMT-0800 (UTC), _isUTC: true, _a: null, _lang: false}

Es scheint, dass alles, was es tut, das Umkehren des _isUTC-Flags ist. : P Es scheint Ortszeit zurückzugeben, unabhängig davon, ob ich .utc () angegeben habe oder nicht.

Ja, .utc und .local drehen einfach das Flag .isUTC um, das in allen Gettern und Setzern verwendet wird.

Da das native Date.toString in der Ortszeit angezeigt wird, wird in beiden Fällen dieselbe Darstellung angezeigt.

.format verwendet jedoch das Flag .isUTC Wenn Sie also einen Moment mit dem Flag isUTC auf true formatieren, wird das Format wie erwartet formatiert.

Beachten Sie die folgenden Unterschiede in Bezug auf Date.prototype.toString , Date.prototype.toUTCString und moment.fn.format .

moment().toDate().toString();     // "Wed Jan 23 2013 09:48:54 GMT-0800 (PST)"
moment.utc().toDate().toString(); // "Wed Jan 23 2013 09:48:54 GMT-0800 (PST)"
moment().toDate().toUTCString();     // "Wed, 23 Jan 2013 17:48:54 GMT"
moment.utc().toDate().toUTCString(); // "Wed, 23 Jan 2013 17:48:54 GMT"
moment().format();     // "2013-01-23T09:48:54-08:00"
moment.utc().format(); // "2013-01-23T17:48:54+00:00"

Selbes Problem hier:
moment (). valueOf () und moment (). utc (). valueOf ()
den gleichen Wert zurückgeben! :enttäuscht:

Um die Millisekunden von utc zu erhalten, muss ich:

moment().valueOf() - (moment().utcOffset() * 60 * 1000)

@rubenspgcavalcante - Ich bin nicht sicher, was Sie fragen. Diese beiden sollen denselben Wert zurückgeben, die beide seit der Unix-Epoche in Millisekunden angegeben sind.

Das von Ihnen geschriebene Snippet gibt tatsächlich einen anderen Zeitpunkt zurück.

Ich habe ein ähnliches Problem, bei dem das UTC-Flag auf true gesetzt ist, aber wenn ich format (); Es gibt die Ortszeit zurück. Hier ist ein Screenshot.

screen shot 2016-07-10 at 8 50 15 am

Die Zeile nach dem Objekt ist ein console.log der var, nachdem ich format () aufgerufen habe. darauf.

Mache ich etwas falsch?

@ james-hoegerl es sieht so aus, als ob das interne Datumsobjekt am 5. Juli 2016 um 19:00 Uhr zentral ist. Fügen Sie dem fünf Stunden hinzu, um zu UTC zu gelangen, und es ist der 6. Juli, der anscheinend protokolliert wird. Kurz gesagt, ich sehe nichts falsches.
Es sieht so aus, als würden Sie den Vollkalender verwenden. Es führt einige Erweiterungs- / Affen-Patches durch, die zu ungewöhnlichem Verhalten führen können.

Ok, vielleicht bin ich nur verwirrt über uct. Ich dachte, ich würde "2016-05-07 07:00:00" bekommen, dann könnte ich das in der Datenbank speichern und dann über einen Moment die Ortszeit für jeden Endbenutzercomputer erhalten.

Als erstes gehe ich davon aus, dass Sie 6016-07-05 (5. Juli, nicht 7. Mai) gemeint haben. Ihre Ortszeit ist der 5. Juli um 19:00 Uhr. Bereinigt um US Central Daylight fügen wir fünf Stunden hinzu. Das ergibt den 6. Juli um Mitternacht.

Wenn Sie vorhaben, den 5. Juli zu bekommen, dann denke ich, dass Sie tatsächlich Ortszeit wollen, nicht UTC. Sie können im Moment .local () aufrufen, um die Ortszeit wiederherzustellen.

Dies kann hilfreich sein: https://maggiepint.com/2016/05/14/moment-js-shows-the-wrong-date/

Vielen Dank für Ihre Hilfe @maggiepint. Ja, mein vorheriger Kommentar war 7-5. Tut mir leid, dass ich diesen Kommentar dieses Wochenende hastig auf mein Handy am Pool geschrieben habe. Ich sehe, wo mein Denken jetzt rückwärts war. Der Vollkalender funktioniert für alle mehrdeutigen Zeitzonen-Momentobjekte. Ich glaube, ich hatte dort nur ein Missverständnis und muss etwas daran arbeiten. Nochmals vielen Dank für Ihre Zeit

Hallo, Um UTC in Benutzerzeit umzuwandeln, müssen wir das Format angeben.
Beispiel: let utcTime = moment ({Stunde: 10, Minute: 20) .format ('JJJJ-MM-TT HH: mm: ss');
let stillUtc = moment.utc (utcTime) .toDate ();
let localTime = moment (stillUtc) .local ();
Jetzt kann ich localTIme bekommen. Aber wenn ich Format entferne, kann ich immer noch UTC-Format. hier ist 10:20 UTC timeZone, die vom Backend kommt. Ich möchte dies dem Benutzer in der Benutzerzeitzone zeigen.

Bitte hilf mir.

Selbes Problem hier:
moment (). valueOf () und moment (). utc (). valueOf ()
den gleichen Wert zurückgeben! 😞
Um die Millisekunden von utc zu erhalten, muss ich:
moment (). valueOf () - (moment (). utcOffset () * 60 * 1000)

@rubenspgcavalcante - Ich bin nicht sicher, was Sie fragen. Diese beiden sollen denselben Wert zurückgeben, die beide seit der Unix-Epoche in Millisekunden angegeben sind.

@ mj1856 Ich verstehe nicht, wie moment (). valueOf () und moment (). utc (). valueOf () den gleichen Wert zurückgeben sollen?

Ich muss den Ausdruck der Verwirrung über die UTC-Funktionalität verstärken. Die intuitivste Erwartung von moment.utc () wäre, dass es ein Moment-Objekt zurückgibt, das das aktuelle Datum / die aktuelle Uhrzeit in UTC-Zeit darstellt. Aber nach dieser Diskussion ist es nicht der Fall und es setzt nur die Flagge. Es ist immer noch unklar, was diese Flagge bewirkt. Nichts davon wird in der Dokumentation erwähnt, was es absolut unzureichend macht. Bitte fügen Sie Ihrem Rückstand eine Erläuterung dieses Themas mit Beispielen hinzu. Vielen Dank.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen