Wie konvertiere ich ein Datum in UTC?

Lesezeit: 7 Minuten

Benutzer-Avatar
dthrasher

Angenommen, ein Benutzer Ihrer Website gibt einen Datumsbereich ein.

2009-1-1 to 2009-1-3

Sie müssen dieses Datum zur Verarbeitung an einen Server senden, aber der Server erwartet, dass alle Daten und Zeiten in UTC angegeben sind.

Angenommen, der Benutzer befindet sich in Alaska. Da sie sich in einer anderen Zeitzone als UTC befinden, muss der Datumsbereich in etwa so konvertiert werden:

2009-1-1T8:00:00 to 2009-1-4T7:59:59

Verwenden des JavaScripts Date Objekt, wie würden Sie den ersten “lokalisierten” Datumsbereich in etwas umwandeln, das der Server versteht?

  • hat dies wiederbelebt, weil es für mich der Top-Google-Hit war und neuere Browser integrierte Unterstützung für UTC-Datumszeichenfolgen haben.

    – jcomeau_ictx

    28. Juni 2012 um 14:25 Uhr

  • Ich habe die akzeptierte Antwort aktualisiert, um die neue Methode ECMAscript 5 toISOString() hervorzuheben. Siehe stackoverflow.com/a/11957822/19112

    – dthrasher

    30. Januar 2013 um 19:18 Uhr

  • Also muss ich mich 2015 mit dem Stringifizieren und Analysieren von Daten herumschlagen? lächerlich!

    – Werkzeugkasten

    23. Februar 2015 um 5:48 Uhr

  • Natürlich hast du. Sie können sich niemals darauf verlassen, dass jemand anderes die Arbeit für Sie erledigt 😛 Zumindest bis die Welt aufhört, Zeitzonen zu verwenden und beginnt, die Daten und Zeiten zu vereinheitlichen.

    – Erenor Paz

    10. Juli 2017 um 8:53 Uhr


  • “Sterndaten”, vorzugsweise.

    – Michael Daw

    14. Dezember 2017 um 22:20 Uhr

Benutzer-Avatar
Will Stern

Das toISOString() -Methode gibt eine Zeichenfolge im vereinfachten erweiterten ISO-Format zurück (ISO 8601), die immer 24 oder 27 Zeichen lang ist (YYYY-MM-DDTHH:mm:ss.sssZ oder ±YYYYYY-MM-DDTHH:mm:ss.sssZ, bzw). Die Zeitzone ist immer null UTC-Offset, wie durch das Suffix “Z“.

Quelle: MDN-Webdokumentation

Das benötigte Format wird mit erstellt .toISOString() Methode. Für ältere Browser (dh 8 und darunter), die diese Methode nicht nativ unterstützen, kann das Shim gefunden werden hier:

Dies gibt Ihnen die Möglichkeit, das zu tun, was Sie brauchen:

var isoDateString = new Date().toISOString();
console.log(isoDateString);

Für Zeitzonenarbeit, moment.js und moment.js Zeitzone sind wirklich unschätzbare Werkzeuge … insbesondere zum Navigieren in Zeitzonen zwischen Client- und Server-Javascript.

  • Tatsächlich konvertiert dies das Datumsobjekt in eine Zeichenfolge und kann keine weiteren Datumsoperationen darauf ausführen

    – orszaczky

    5. September 2014 um 3:01 Uhr

  • @TheRebel, der angegebene Anwendungsfall ist, dass er dem Server eine formatierte Zeichenfolge senden muss.

    – Will Stern

    5. September 2014 um 15:51 Uhr

  • @Will, du hast vollkommen recht, aber ich bin – wie die meisten Zuschauer hier wohl – aufgrund des Titels hier angekommen und habe nach dem allgemeinen JS-Datum in die UTC-Konvertierung gesucht, also dachte ich, es wäre nützlich, es hier zu erwähnen 🙂

    – orszaczky

    6. September 2014 um 5:22 Uhr

  • Seien Sie vorsichtig, wenn Sie diese Methode anwenden! Es erstellt kein UTC-Datum – es formatiert die vorhandenen Datumsdaten unverändert in ein UTC-Format und gibt ihnen eine „Z“-Zeitzone. Das ist zu 99% falsch! Sie müssen das Datum in die GMT-Zeitzone konvertieren, bevor Sie diese Methode verwenden!

    – Benutzer1944491

    23. August 2018 um 13:00 Uhr

  • @ user1944491 Ich glaube nicht, dass das richtig ist. Laut den MDN-Dokumenten toISOString wird korrekt in UTC konvertiert [toISOString] returns a string in simplified extended ISO format ... The timezone is always zero UTC offset Außerdem zeigen sie im Beispiel, dass der Offset berücksichtigt wird, wenn toISOString aufgerufen wird

    – F F F

    27. Februar 2019 um 20:35 Uhr


Benutzer-Avatar
Adam Pietrasiak

Meine Lösung hält das Datum gleich, egal welche Zeitzone auf der Clientseite eingestellt ist. Vielleicht findet es jemand nützlich.

Mein Anwendungsfall:

Ich erstelle eine Todo-App, in der Sie das Datum Ihrer Aufgabe festlegen. Dieses Datum sollte unabhängig von der Zeitzone, in der Sie sich befinden, konstant bleiben.

Beispiel. Sie möchten Ihren Freund am 25. Juni um 8 Uhr anrufen.

Sie erstellen diese Aufgabe 5 Tage vorher (20. Juni), während Sie in China sind.

Am selben Tag fliegst du dann für ein paar Tage nach New York.

Dann, am 25. Juni, während Sie noch in New York sind, wachen Sie um 7:30 Uhr auf (was bedeutet, dass Sie in 30 Minuten eine Aufgabenbenachrichtigung erhalten sollten (obwohl es in China, wo Sie beim Erstellen der Datei waren, bereits 13:30 Uhr ist). Aufgabe)

Die Aufgabe ignoriert also die Zeitzone. Es bedeutet „Ich möchte es um 8 Uhr in der Zeitzone machen, in der ich mich aufhalte“.

Was ich tue, ist sagen wir: „Ich nehme an, Sie befinden sich immer in der Londoner Zeitzone – UTC“.

Das bedeutet: Wenn der Benutzer ein Datum in seiner/ihrer Zeitzone auswählt, konvertiere ich dieses Datum in dasselbe Datum in UTC. dh. Sie wählen 8 Uhr morgens in China, aber ich konvertiere es in 8 Uhr morgens in UTC.

Dann – beim nächsten Öffnen der App – lese ich das in UTC gespeicherte Datum und konvertiere es in das gleiche Datum in Ihrer aktuellen Zeitzone – z. Ich konvertiere 8 Uhr in UTC in 8 Uhr in der New Yorker Zeitzone.

Diese Lösung bedeutet, dass das Datum etwas anderes bedeuten kann, je nachdem, wo Sie es einstellen und wo Sie es lesen, aber es bleibt so konstant, dass es sich anfühlt, als ob Sie sich immer in derselben Zeitzone befinden.

Lassen Sie uns etwas Code schreiben:

Erstens – wir haben 2 Hauptfunktionen zum Konvertieren von/nach UTC, wobei die Zeitzone ignoriert wird:

export function convertLocalDateToUTCIgnoringTimezone(date: Date) {
  const timestamp = Date.UTC(
    date.getFullYear(),
    date.getMonth(),
    date.getDate(),
    date.getHours(),
    date.getMinutes(),
    date.getSeconds(),
    date.getMilliseconds(),
  );

  return new Date(timestamp);
}

export function convertUTCToLocalDateIgnoringTimezone(utcDate: Date) {
  return new Date(
    utcDate.getUTCFullYear(),
    utcDate.getUTCMonth(),
    utcDate.getUTCDate(),
    utcDate.getUTCHours(),
    utcDate.getUTCMinutes(),
    utcDate.getUTCSeconds(),
    utcDate.getUTCMilliseconds(),
  );
}

Dann speichere/lese ich dieses Datum wie folgt:

function saveTaskDate(localDate: Date) {
  // I convert your local calendar date so it looks like you've picked it being in UTC somewhere around London
  const utcDate = convertLocalDateToUTCIgnoringTimezone(localDate);
  api.saveTaskDate(utcDate);
}

function readTaskDate(taskUtcDate: Date) {
  // I convert this UTC date to 'look in your local timezone' as if you were now in UTC somewhere around london
  const localDateWithSameDayAsUTC = convertUTCToLocalDateIgnoringTimezone(taskUtcDate);

  // this date will have the same calendar day as the one you've picked previously
  // no matter where you were saving it and where you are now
}

  • Ich mochte Ihre Idee und habe eine Methode angewendet, die ich schon oft verwendet habe. function convertDateToUTC(date) { return new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds()); }

    – Tim

    4. Oktober 2011 um 14:45 Uhr


  • Der kürzeste Code, den ich mir ausgedacht habe, um das UTC-Datum und die Uhrzeit zu erhalten, besteht darin, die Zeitzone abzuschneiden: new Date(new Date().toUTCString().substr(0, 25))

    – joelvh

    18. März 2012 um 3:58 Uhr


  • Beachten Sie, dass getUTCMonth() die Werte 0 bis 11 zurückgibt. Wenn Sie also den Monat als Zahl anstelle einer Zeichenfolge benötigen, hilft es, dem Wert +1 hinzuzufügen.

    – Talvi Watia

    6. Juni 2012 um 16:51 Uhr


  • Das ist Unsinn. Das neue Datum wird einen anderen Wert haben, als Sie eigentlich wollen. Benutz einfach now.toUTCSTring() statt (falsch) now_utc.toString().

    – Bergi

    25. Januar 2013 um 15:02 Uhr

  • Ich würde das nicht verwenden – durch die Verwendung von new Date() erhalten Sie die Zeitzone des Browsers. In Chrome 29 und IE10 scheinen Datum und Uhrzeit korrekt zu sein, aber die Zeitzone ist auf die Zeitzone des Browsers eingestellt, was zu Problemen führen kann …

    – Sean

    29. August 2013 um 14:21 Uhr

Benutzer-Avatar
Schwach

Hier ist meine Methode:

var now = new Date();
var utc = new Date(now.getTime() + now.getTimezoneOffset() * 60000);

Das Ergebnis utc Das Objekt ist nicht wirklich ein UTC-Datum, sondern ein lokales Datum, das verschoben wurde, um der UTC-Zeit zu entsprechen (siehe Kommentare). In der Praxis erfüllt es jedoch seinen Zweck.

Benutzer-Avatar
Michael Freigeim

Eine andere Lösung, um in UTC zu konvertieren und es als Datumsobjekt zu behalten: (Es funktioniert, indem der ‘GMT’-Teil vom Ende der formatierten Zeichenfolge entfernt und dann wieder in den Datumskonstruktor eingefügt wird.)

var now = new Date();
var now_utc = new Date(now.toUTCString().slice(0, -4));
console.log(now_utc)

Ich musste dies tun, um eine Schnittstelle zu einer Datetime-Picker-Bibliothek herzustellen. Aber im Allgemeinen ist es eine schlechte Idee, auf diese Weise mit Datumsangaben zu arbeiten.

Benutzer möchten im Allgemeinen mit Datetimes in ihrer Ortszeit arbeiten, also aktualisieren Sie entweder den serverseitigen Code, um Datetime-Strings mit Offsets korrekt zu analysieren, und konvertieren dann in UTC (beste Option) oder Sie konvertieren clientseitig in einen UTC-String, bevor Sie ihn an senden Server (wie in Will Sterns Antwort)

1010830cookie-checkWie konvertiere ich ein Datum in UTC?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy