Wie konvertiere ich das Datum von Moment.js in die lokale Zeitzone des Benutzers?

84

Ich verwende die Frameworks Moment.js und Moment-Timezone und habe ein Moment.js-Datumsobjekt, das sich explizit in der UTC-Zeitzone befindet. Wie kann ich das in die aktuelle Zeitzone des Browsers konvertieren?

var testDateUtc = moment.tz("2015-01-30 10:00:00", "UTC"); var localDate = ???

Es wäre also in Ordnung, wenn ich die lokale Zeitzone des Benutzers herausfinden könnte. oder alternativ möchte ich das Datumsobjekt in ein anderes Datenobjekt konvertieren, das nur die "lokale Zeitzone" verwendet, egal was das tatsächlich ist.

oliver
quelle

Antworten:

139

Sie müssen hierfür keine Moment-Zeitzone verwenden. Die Hauptbibliothek moment.js bietet alle Funktionen für die Arbeit mit UTC und der lokalen Zeitzone.

var testDateUtc = moment.utc("2015-01-30 10:00:00");
var localDate = moment(testDateUtc).local();

Von dort aus können Sie alle Funktionen verwenden, die Sie erwarten:

var s = localDate.format("YYYY-MM-DD HH:mm:ss");
var d = localDate.toDate();
// etc...

Beachten Sie, dass durch Übergeben testDateUtceines momentObjekts an den moment()Konstruktor ein Klon erstellt wird . Andernfalls wird beim Aufruf .local()auch der testDateUtcWert anstelle nur des localDateWerts geändert . Momente sind veränderlich .

Beachten Sie auch, dass Sie Ihre ursprüngliche Eingabe direkt mit analysieren können , wenn sie einen Zeitzonenversatz wie +00:00oder enthält . Sie müssen nicht verwenden oder . Zum Beispiel:Zmoment.utc.local

var localDate = moment("2015-01-30T10:00:00Z");
Matt Johnson-Pint
quelle
4
Sie sollten sich bewusst sein, dass diese Methode DST-Offsets nicht berücksichtigt. Es ist sicherer, die moment-timezoneBibliothek zu verwenden
Jaime Agudo,
2
@ Jaime nicht wahr. localberücksichtigt in der Tat die Sommerzeit.
Matt Johnson-Pint
Sie können selbst prüfen , ob Sie beispielsweise von ESTnach übersetzen CET. Ich werde morgen ein Beispiel geben, wenn Sie möchten NY-> Madrid. Ich werde das Gegenbeispiel akzeptieren :)
Jaime Agudo
1
Sie haben Recht, dass dieser Moment diese Art der Konvertierung nicht ohne Moment-Zeit-Zone durchführen kann. Es kann jedoch ordnungsgemäß zwischen UTC und lokal konvertieren, was das OP verlangt hat.
Matt Johnson-Pint
2
Lokale Regeln kommen vom Browser. Solange die lokale Zeitzone die Sommerzeit enthält, wird sie von moment verwendet.
Matt Johnson-Pint
23
var dateFormat = 'YYYY-DD-MM HH:mm:ss';
var testDateUtc = moment.utc('2015-01-30 10:00:00');
var localDate = testDateUtc.local();
console.log(localDate.format(dateFormat)); // 2015-30-01 02:00:00
  1. Definieren Sie Ihr Datumsformat.
  2. Erstellen Sie ein Moment-Objekt und setzen Sie das UTC-Flag für das Objekt auf true.
  3. Erstellen Sie ein lokalisiertes Momentobjekt, das aus dem ursprünglichen Momentobjekt konvertiert wurde.
  4. Gibt eine formatierte Zeichenfolge vom lokalisierten Momentobjekt zurück.

Siehe: http://momentjs.com/docs/#/manipulating/local/

AndrewHenderson
quelle
Diese Antwort wäre noch besser, wenn sie erklären würde, warum dies funktioniert, möglicherweise unter Bezugnahme auf die Dokumentation. Vielleicht möchten Sie auch erklären, wie sich diese Antwort von der im März veröffentlichten unterscheidet ...
Heretic Monkey
@ AndrewHenderson, die Zeit ist eine Stunde vor der lokalen Maschinenzeit. Warum passiert das?
Ramesh Papaganti
@RameshPapaganti Vielleicht Sommerzeit? Zum Beispiel PDT vs PST. Es ist bekannt, dass Moment die API zwischen den Versionen ändert, insbesondere wenn es um die Lokalisierung geht. Lassen Sie mich wissen, ob Sie die Ursache gefunden haben.
Andrew Henderson
6

Folgendes habe ich getan:

var timestamp = moment.unix({{ time }});
var utcOffset = moment().utcOffset();
var local_time = timestamp.add(utcOffset, "minutes");
var dateString = local_time.fromNow();

Wo {{ time }}ist der utc-Zeitstempel?

Sayan
quelle
3

Verwenden Sie die Funktion utcOffset.

var testDateUtc = moment.utc("2015-01-30 10:00:00");
var localDate = moment(testDateUtc).utcOffset(10 * 60); //set timezone offset in minutes
console.log(localDate.format()); //2015-01-30T20:00:00+10:00
Alexey Ryazhskikh
quelle