Moment.js wird in ein Datumsobjekt umgewandelt


696

Mit Moment.js kann ich ein korrektes Momentobjekt nicht in ein Datumsobjekt mit Zeitzonen umwandeln. Ich kann das richtige Datum nicht bekommen.

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 Leistung erhalten Sie?
Felix Kling

4
4 Zeilen erhalten mich so Ausgabe: <code> (Datumsobjekt) Zeit mit Offset Do 01.08.2013 15:23:49 GMT + 0300 (Финляндия (лето)) </ code> Aber die Zeitzone muss MST7MDT sein
vadim.zhiltsov

Wednesday 24th 2019, 12:47:48 amist das möglich in umzuwandeln 2019-04-23T19:17:48.000Z ? @ vadim.zhiltsov
Anupam Maurya

Datumsobjekte haben keine Zeitzone, sondern nur einen Versatz von 1970-01-01T00: 00: 00Z. Wenn Sie also toDate aufrufen , hat das zurückgegebene Objekt die Zeitzoneninformationen verloren, mit denen Sie das Moment-Objekt angehängt haben .tz("MST7MDT"). Aus diesem Grund gibt es Bibliotheken wie moment.tz, um die Bare-Bones-Fähigkeit des integrierten Date-Objekts zu ergänzen, das nur UTC und die Host-Zeitzone versteht.
RobG

Antworten:


1234

Verwenden Sie diese Option, um ein Momentobjekt in ein Datumsobjekt umzuwandeln:

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

moment().toDate();

Ausbeuten:

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

11
@Spencer - Ja, es beantwortet den Titel und toDateist in der Tat, wie man ein DateObjekt von einem erhält moment. Der Code im Hauptteil der Frage fragt jedoch nach der Zeitzonenkonvertierung - was Datenicht möglich ist. Wenn die Bergzeit nicht tatsächlich die Zeitzone des Benutzers ist, bin ich mir nicht sicher, wie dies die Frage beantwortet hat.
Matt Johnson-Pint

1
@Matt es kommt nur darauf an, welchen Teil der Frage du betrachtest. Eine Mehrheit der Menschen sucht bei Google und stellt fest, dass dieser Titel mit ihrer Frage übereinstimmt, und stimmt der Antwort zu, die den Titel und nicht den Hauptteil der Frage beantwortet. Das könnte erklären, warum dies die meisten positiven Stimmen hat, obwohl es dem OP technisch nicht hilft.
Spencer

14
Ist das eigentlich die richtige Antwort? Die Frage war, wie das Moment-Objekt mit TIMEZONE in ein Javascript-Datum umgewandelt werden kann. Beim Wechsel zum Javascript-Datumsobjekt wird immer noch die lokale Zeitzone wiederhergestellt.
Unaussprechlich

1
Hey Leute, schaut euch diesen Link an momentjs.com/guides/#/warnings/js-date . Dies wird nicht empfohlen und wird in der kommenden Hauptversion entfernt.
Gtzinos

3
@gtzinos Was Sie verlinken und auf das Sie verweisen, ist ein separates Problem und Szenario, z. B. moment("12/12/2011")wenn Sie eine Zeichenfolge an den Momentkonstruktor übergeben, erhalten Sie diese Nachricht. Es hat nichts damit zu tun, von Moment zu Tag zu gehen, objmoment().toDate()
btbJosh

51

Solange Sie die Moment-Zeitzone mit den Daten für die gewünschten Zonen initialisiert haben , funktioniert Ihr Code wie erwartet.

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

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

Vielleicht versuchen Sie nur, die Ausgabeformatzeichenfolge zu ändern? Wenn ja, geben Sie einfach die gewünschten Parameter für die formatMethode an:

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

In Bezug auf die letzten Zeilen Ihres Codes: Wenn Sie mit zu einem DateObjekt zurückkehren toDate(), geben Sie das Verhalten von moment.js auf und kehren zum Verhalten von JavaScript zurück. Ein JavaScript- DateObjekt wird immer in der lokalen Zeitzone des Computers gedruckt, auf dem es ausgeführt wird. Es gibt nichts, was moment.js dagegen tun kann.

Ein paar andere kleine Dinge:

  • Während der Moment, in dem der Konstruktor a ausführen kann , Dateist es normalerweise am besten, keinen zu verwenden. Für "jetzt" nicht verwenden moment(new Date()). Verwenden Sie stattdessen einfach moment(). Beides wird funktionieren, ist aber unnötig redundant. Wenn Sie aus einer Zeichenfolge analysieren, übergeben Sie diese Zeichenfolge direkt an moment. Versuchen Sie nicht, es auf eine Dateerste zu analysieren . Sie werden feststellen, dass der Parser von moment viel zuverlässiger ist.

  • Zeitzonen wie MST7MDTsind aus Gründen der Abwärtskompatibilität vorhanden. Sie stammen aus Zeitzonen im POSIX-Stil, und nur wenige davon befinden sich in den TZDB-Daten. Sofern nicht unbedingt erforderlich, sollten Sie einen Schlüssel wie z America/Denver.


Danke Matt! Ihre Antwort war nützlich. Wie Sie bereits über die Verwendung von America / Denver anstelle von MST7MDT erwähnt haben, ist für diese Zuordnungen eine Karte verfügbar? Ich verwende einige solcher Zeitzonen wie CET, EET, EST5EDT, CST6CDT, PST8PDT.
Monish001

Ist es möglich, zB: "10:20 AM" (Erhaltene Zeichenfolgenzeit von moment (). Format ('hh: mm A')) in Datumsobjekt zu konvertieren?
RAM

2
@ram - 1) Wenn Sie einen Moment Zeit haben, verwenden Sie einfach .toDate(). 2) Verwenden Sie keine Kommentare, um neue Fragen zu stellen. Dafür ist der große "Frage stellen" -Button gedacht.
Matt Johnson-Pint

22

.toDate hat nicht wirklich für mich gearbeitet, also, hier ist was ich getan habe:

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

hoffe das hilft


2
Diese Antwort beantwortet die Frage nicht. Der Code ist eine langwierige Schreibweise moment().add(1, 'd').toDate().
RobG

12

Da momentjs keine Kontrolle über das Javascript-Datumsobjekt hat, habe ich eine Lösung dafür gefunden.

const currentTime = new Date();    
const convertTime = moment(currentTime).tz(timezone).format("YYYY-MM-DD HH:mm:ss");
const convertTimeObject = new Date(convertTime);

Dadurch erhalten Sie ein Javascript-Datumsobjekt mit der konvertierten Zeit


2
Dies ist die einzig richtige Antwort, die die Frage direkt beantwortet.
Anish Sana

1
Genau das wollte ich. Ich hatte erwartet, dass native Daten Zeitzonen korrekt darstellen, aber ich habe mich leider geirrt.
mklbtz

1
Das Format "JJJJ-MM-TT HH: mm: ss" wird von Safari nicht unterstützt, daher ist das Ergebnis null . Das Format sollte "JJJJ-MM-TTTHH: mm: ss" sein (verwenden Sie ein von ECMAScript unterstütztes Format, ein "T" zwischen Datum und Uhrzeit).
RobG

4

Ich musste Zeitzoneninformationen in meiner Datumszeichenfolge haben. Ich habe ursprünglich verwendet, moment.tz(dateStr, 'America/New_York').toString();aber dann bekam ich Fehler beim Zurückführen dieser Zeichenfolge in den Moment.

Ich habe es versucht, moment.tz(dateStr, 'America/New_York').toDate();aber dann habe ich Zeitzoneninformationen verloren, die ich brauchte.

Die einzige Lösung, die eine verwendbare Datumszeichenfolge mit Zeitzone zurückgab , die in den Moment zurückgeführt werden konnte, warmoment.tz(dateStr, 'America/New_York').format();


4
let dateVar = moment('any date value');
let newDateVar = dateVar.utc().format();

schön und sauber!!!!


Dies war in meinem Fall die einzige Lösung, die sich als utc-Format herausstellte. Danke
Luis Febro

3

So konvertieren Sie ein beliebiges Datum, z. B. utc:

moment( moment().utc().format( "YYYY-MM-DD HH:mm:ss" )).toDate()

2
Das hat mir wirklich den Tag gerettet!
HV Sharma

Diese Antwort ist falsch. Der Zeitzonenversatz wird zweimal angewendet: moment().utc()Gibt Werte für UTC zurück und gibt dann .format( "YYYY-MM-DD HH:mm:ss" )eine Zeichenfolge zurück, die ohne Zeitzonenversatz auf UTC gesetzt wurde und daher als lokal analysiert wird. Es stimmt nicht mit einem Standard-Moment-Format überein und wird daher vom integrierten Parser analysiert. Es stimmt auch nicht mit einem von ECMAScript unterstützten Format überein, daher ist das Parsen von der Implementierung abhängig. Auf jeden Fall wird es als lokal analysiert, sodass der Zeitzonenversatz beim Erstellen des Zeitwerts des Datums erneut angewendet wird.
RobG

3

Die Frage ist etwas dunkel. Ich werde mein Bestes geben, um dies zu erklären. Zuerst sollten Sie verstehen, wie man die Moment-Zeitzone verwendet . Entsprechend dieser Antwort hier ist TypeError: moment (). Tz keine Funktion , Sie müssen den Moment aus der Moment-Zeitzone anstelle des Standard-Moments importieren (natürlich müssen Sie zuerst die Moment-Zeitzone npm installieren!). Aus Gründen der Klarheit,

const moment=require('moment-timezone')//import from moment-timezone

Um die Zeitzonenfunktion zu verwenden, verwenden Sie jetzt moment.tz ("date_string / moment ()", "time_zone") ( weitere Informationen finden Sie unter https://momentjs.com/timezone/ ). Diese Funktion gibt ein Momentobjekt mit einer bestimmten Zeitzone zurück. Aus Gründen der Klarheit,

var newYork= moment.tz("2014-06-01 12:00", "America/New_York");/*this code will consider NewYork as the timezone.*/

Wenn Sie nun versuchen, newYork (das Moment-Objekt) mit dem toDate () von Moment (ISO 8601-Formatkonvertierung) zu konvertieren, erhalten Sie die Zeit von Greenwich, UK. Weitere Informationen finden Sie in diesem Artikel https://www.nhc.noaa.gov/aboututc.shtml über UTC. Wenn Sie jedoch nur Ihre Ortszeit in diesem Format (New Yorker Zeit, gemäß diesem Beispiel) möchten , fügen Sie einfach die Methode .utc (true) mit dem Argument true zu Ihrem Momentobjekt hinzu . Aus Gründen der Klarheit,

newYork.toDate()//will give you the Greenwich ,UK, time.

newYork.utc(true).toDate()//will give you the local time. according to the moment.tz method arg we specified above, it is 12:00.you can ofcourse change this by using moment()

Kurz gesagt, moment.tz berücksichtigt die von Ihnen angegebene Zeitzone und vergleicht Ihre Ortszeit mit der Zeit in Greenwich, um ein Ergebnis zu erhalten. Ich hoffe das war nützlich.


2

moment hat die js lib ab 06/2018 aktualisiert.

var newYork    = moment.tz("2014-06-01 12:00", "America/New_York");
var losAngeles = newYork.clone().tz("America/Los_Angeles");
var london     = newYork.clone().tz("Europe/London");

newYork.format();    // 2014-06-01T12:00:00-04:00
losAngeles.format(); // 2014-06-01T09:00:00-07:00
london.format();     // 2014-06-01T17:00:00+01:00

Wenn Sie die Freiheit haben, Angular5 + zu verwenden, verwenden Sie dort besser die datePipe-Funktion als die Zeitzonenfunktion hier. Ich muss moment.js verwenden, da mein Projekt nur auf Angular2 beschränkt ist.


1

versuchen (ohne formatSchritt)

new Date(moment())


new Date(moment())ist äquivalent zu new Date(). Die Zeitzone ist nur für d eingestellt .
RobG
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.