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.

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");

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/


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?


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
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.