2013-08-01 15 views
372

Moment.js verwenden Ich kann ein korrektes Momentobjekt nicht in ein Datumsobjekt mit Zeitzonen umwandeln. Ich kann das richtige Datum nicht finden.Moment.js in ein Objekt transformieren

Beispiel:

var oldDate = new Date(), 
    momentObj = moment(oldDate).tz("MST7MDT"), 
    newDate = momentObj.toDate(); 
console.log("start date " + oldDate) 
console.log("Format from moment with offset " + momentObj.format()) 
console.log("Format from moment without offset " + momentObj.utc().format()) 
console.log("(Date object) Time with offset " + newDate) 
console.log("(Date object) Time without offset "+ moment.utc(newDate).toDate()) 
+1

Welche Leistung erwarten Sie und welche Ausgabe bekommen Sie? –

+2

4 Reihe erhalten mich so: (Date object) Time with offset Thu Aug 01 2013 15:23:49 GMT+0300 (Финляндия (лето)) Aber Zeitzone muss MST7MDT sein –

Antwort

690

verwenden einen Moment Objekt in ein Date-Objekt zu verwandeln:

Von http://momentjs.com/docs/#/displaying/as-javascript-date/

moment().toDate(); 

Ausbeuten: So

Tue Nov 04 2014 14:04:01 GMT-0600 (CST) 
+2

@Spencer - Ja, es beantwortet den Titel, und 'toDate' ist in der Tat, wie man ein' Date'-Objekt von einem 'Moment' erhält. Aber der Code im Hauptteil der Frage fragt nach der Zeitzonenumwandlung - was "Date" nicht kann. Sofern Mountain Time tatsächlich die Zeitzone des Nutzers ist, bin ich mir nicht sicher, wie diese die Frage beantwortet hat. –

+1

@Matt hängt nur ab, welcher Teil der Frage, die Sie betrachten. Eine Mehrheit von Leuten sucht Google und sieht, dass dieser Titel mit ihrer Frage übereinstimmt und die Antwort auflistet, die den Titel, nicht den Körper der Frage beantwortet. Das könnte erklären, warum dies die meisten Upvotes hat, obwohl es dem OP technisch nicht hilft. – Spencer

+6

Ist das wirklich die richtige Antwort? Die Frage war, wie man das Moment-Objekt in ein Javascript-Datum umwandelt, aber mit TIMEZONE. Es wird immer noch auf die lokale Zeitzone zurückgesetzt, wenn das JavaScript-Datumsobjekt geändert wird. – Unspeakable

30

Solange Sie moment-timezone mit the data for the zones you want initialisiert haben, ist Ihr Code funktioniert wie erwartet.

Sie konvertieren den Moment korrekt in die Zeitzone, die sich in der zweiten Zeile der Ausgabe von momentObj.format() widerspiegelt.

Durch die Umschaltung auf UTC wird nicht nur der Offset gelöscht, sondern auch die UTC-Zeitzone. Wenn Sie das tun, brauchen Sie den ursprünglichen .tz() Anruf überhaupt nicht. Sie könnten einfach moment.utc() tun.

Vielleicht versuchen Sie gerade, die Ausgabeformatzeichenfolge zu ändern? Wenn ja, geben Sie einfach die Parameter, die Sie an die format Methode wollen:

momentObj.format("YYYY-MM-DD HH:mm:ss") 

die letzten Zeilen des Codes In Bezug auf - wenn Sie zu einem Date Objekt zurück toDate() verwenden, Sie geben das Verhalten Moment auf. js und gehe zurück zu JavaScript's Verhalten. Ein JavaScript-Objekt Date wird immer in der lokalen Zeitzone des Computers gedruckt, auf dem es ausgeführt wird. Es gibt nichts Moment. Js kann das tun.

Ein paar andere kleine Dinge:

  • Während der Moment Konstruktor ein Date nehmen kann, ist es in der Regel am besten nicht zu verwenden. Verwenden Sie für "jetzt" nicht moment(new Date()). Verwenden Sie stattdessen einfach moment(). Beide werden funktionieren, aber es ist unnötig überflüssig. Wenn Sie von einer Zeichenfolge analysieren, übergeben Sie diese Zeichenfolge direkt in Moment. Versuchen Sie nicht zuerst, es zu einem Date zu analysieren. Sie werden feststellen, dass der Moment-Parser viel zuverlässiger ist.

  • Zeitzonen wie MST7MDT sind aus Gründen der Abwärtskompatibilität da. Sie stammen aus POSIX-Zeitzonen, und nur wenige von ihnen sind in den TZDB-Daten enthalten. Sofern nicht unbedingt erforderlich, sollten Sie einen Schlüssel wie America/Denver verwenden.

+0

Danke Matt! Deine Antwort war nützlich. Wie Sie erwähnt haben, anstatt MST7MDT America/Denver zu verwenden, gibt es eine Karte für diese Mappings? Ich verwende einige Zeitzonen wie CET, EET, EST5EDT, CST6CDT, PST8PDT. – Monish

+2

http://wikipedia.org/wiki/List_of_tz_database_time_zones –

+0

ist es möglich zu konvertieren zB: "10:20 AM" (Erhalten String Zeit von Moment(). Format ('hh: mm A')) nach Datum Objekt ?? – ram

12

.toDate nicht wirklich für mich arbeiten, , Hier ist was ich getan habe:

futureStartAtDate = new Date(moment().locale("en").add(1, 'd').format("MMM DD, YYYY HH:MM")) 

Hoffnung hilft diese

3

Ich brauchte die Zeitzoneninformationen in meinem Date Zeichenfolge haben.Ich benutzte ursprünglich moment.tz(dateStr, 'America/New_York').toString();, aber dann fing ich an, Fehler zu bekommen, diese Schnur in Moment zurückzugeben.

Ich versuchte die moment.tz(dateStr, 'America/New_York').toDate(); aber dann verlor ich Zeitzone Informationen, die ich brauchte.

Die einzige Lösung, die ein nutzbares Datum Zeichenfolge mit Zeitzone zurück, die wieder in Augenblick zugeführt werden konnte, war moment.tz(dateStr, 'America/New_York').format();