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, der Server erwartet jedoch, dass alle Daten und Zeiten in UTC vorliegen.
Angenommen, der Benutzer befindet sich in Alaska, Hawaii oder Fidschi. Da sie sich in einer anderen Zeitzone als UTC befinden, muss der Datumsbereich in etwa Folgendes konvertiert werden:
2009-1-1T8:00:00 to 2009-1-4T7:59:59
Wie würden Sie mit dem JavaScript-Datumsobjekt den ersten "lokalisierten" Datumsbereich in etwas konvertieren, das der Server versteht?
javascript
date
utc
dthrasher
quelle
quelle
Antworten:
Quelle: MDN-Webdokumente
Das benötigte Format wird mit der
.toISOString()
Methode erstellt. Für ältere Browser (dh 8 und darunter), die diese Methode nicht nativ unterstützen, finden Sie den Shim hier :Dies gibt Ihnen die Möglichkeit, das zu tun, was Sie brauchen:
Für die Zeitzonenarbeit sind moment.js und moment.js Zeitzone wirklich unschätzbare Werkzeuge ... insbesondere zum Navigieren in Zeitzonen zwischen Client- und Server-Javascript.
quelle
toISOString
wird ordnungsgemäß in UTC konvertiert.[toISOString] returns a string in simplified extended ISO format ... The timezone is always zero UTC offset
Auch in dem Beispiel wird der Offset berücksichtigt, wenn toISOString aufgerufen wirdEinfach und dumm
quelle
function convertDateToUTC(date) { return new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds()); }
new Date(new Date().toUTCString().substr(0, 25))
now.toUTCSTring()
anstelle von (falsch)now_utc.toString()
.Hier ist meine Methode:
Das resultierende
utc
Objekt ist nicht wirklich ein UTC-Datum, sondern ein lokales Datum, das an die UTC-Zeit angepasst wurde (siehe Kommentare). In der Praxis macht es jedoch den Job.quelle
Date.now()
es Ortszeit und keine UTC-Zeit gibt, und diese Lösung scheint mir die einfachste zu sein. Zumindest in meinem Fall, in dem ich UNIX-Zeit und keine schön formatierte Zeichenfolge möchte. (Der einzige Unterschied war, dass ich mit multiplizieren würde60 * 1000
, um ganz klar zu sein :))now.toString()
mitutc.toString()
: Es gibt keine Zeitzonenänderung, sondern eine Zeitänderung, was etwas ganz anderes ist. Eine sauberere Lösung wäre jedoch viel komplexer (ich denke schon), und dieser Code erledigt die Arbeit in den allermeisten Fällen, solange man sich nicht weiter mit Zeitzonen befasst. Ich erinnerte mich an das Stanzen von Enten : etwas anderes, aber dazu gebracht, mich gleich zu verhalten. Beachten Sie auch, dass der Code von DrunkCoder das gleiche Problem aufweist.quelle
In ISO konvertieren, ohne Datum / Uhrzeit zu ändern
Konvertieren in ISO mit Änderung von Datum / Uhrzeit (Datum / Uhrzeit werden geändert)
Geigenlink
quelle
Browser können abweichen, und Sie sollten auch daran denken, den vom Client generierten Informationen nicht zu vertrauen. Die folgende Anweisung funktioniert jedoch für mich (Google Chrome v24 unter Mac OS X 10.8.2).
var utcDate = new Date(new Date().getTime());
edit: "Wie ist das anders als nur
new Date()
?" siehe hier: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateDas Hinzufügen des 60000 * Date.getTimezoneOffset (), wie in den vorherigen Antworten angegeben, ist falsch. Zunächst müssen Sie sich alle Daten / Zeiten als UTC mit einem Zeitzonenmodifikator für Anzeigezwecke vorstellen.
Auch hier können sich die Browser unterscheiden. Date.getTime () gibt jedoch die Anzahl der Millisekunden seit dem 01.01.1970 UTC / GMT zurück. Wenn Sie wie oben beschrieben ein neues Datum mit dieser Nummer erstellen, ist dies UTC / GMT. Wenn Sie es jedoch durch Aufrufen von .toString () anzeigen, wird es in Ihrer lokalen Zeitzone angezeigt, da .toString () Ihre lokale Zeitzone verwendet und nicht die Zeitzone des Date-Objekts, für das es aufgerufen wird.
Ich habe auch festgestellt, dass, wenn Sie .getTimezoneOffset () an einem Datum aufrufen, Ihre lokale Zeitzone zurückgegeben wird, nicht die Zeitzone des Datumsobjekts, für das Sie es aufgerufen haben (ich kann dies jedoch nicht als Standard überprüfen).
Wenn Sie in meinem Browser 60000 * Date.getTimezoneOffset () hinzufügen, wird eine DateTime erstellt, die nicht UTC ist . Wenn es jedoch in meinem Browser angezeigt wird (z. B. .toString ()), wird in meiner lokalen Zeitzone eine DateTime angezeigt, die der UTC-Zeit entspricht, wenn die Zeitzoneninformationen ignoriert werden.
quelle
new Date()
, weder Zeitstempel noch Zeitzone werden geändertnew Date().getTime()
gibt immer einen Zeitstempel zurück, der unabhängig von der Zeitzone ist. Es ist kein Zeitstempel damit verbunden, bis Sie versuchen, ihn in etwas anderes als die Anzahl der Millisekunden seit der Unix-Epoche zu formatieren.new Date(new Date().getTime())
gibt es genau den gleichen Wert zurück wienew Date()
. Können Sie erklären, in welchem Sinne Ihre Antwort einen anderen Wert liefertnew Date()
?new Date("5/19/2014").getTime()
. Der Datumskonstruktor hat ein Datum mit einem Versatz von +7 erstellt. Auf dem Server (C #) füge ich den veröffentlichten Wert als Millisekunden zur Unix-Epoche hinzunew DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddMilliseconds(1401087600000)
. Das Ergebnis ist5/19/2014 7:00:00 AM
. GetTime () gibt also anscheinend die Anzahl der Millisekunden einschließlich meines UTC-Offsets an.new Date(new Date().getTime())
nicht funktionieren. Ich kann bestätigen, dassnew Date(Date.UTC(2019, 8, 27, 0, 0, 0))
dies tatsächlich UTC-Zeit erzeugt. Wenn Sie nicht verwenden, erhaltenDate.UTC(...)
Sie Daten in UTC-Offset in Ihrer Zeitzone.quelle
Eine andere Lösung, um in UTC zu konvertieren und es als Datumsobjekt zu behalten: (Es entfernt den 'GMT'-Teil vom Ende der formatierten Zeichenfolge und setzt ihn dann wieder in den Datumskonstruktor ein.)
Ich musste dies tun, um eine Schnittstelle mit einer Datetime Picker-Bibliothek herzustellen. Aber im Allgemeinen ist es eine schlechte Idee, auf diese Weise mit Daten zu arbeiten.
Benutzer möchten im Allgemeinen mit Datumsangaben in ihrer Ortszeit arbeiten. Aktualisieren Sie daher entweder den serverseitigen Code, um Datums- / Uhrzeitzeichenfolgen mit Offsets korrekt zu analysieren, und konvertieren Sie sie dann in UTC (beste Option) oder konvertieren Sie sie clientseitig in eine UTC-Zeichenfolge, bevor Sie sie an senden Server (wie in Will Sterns Antwort)
quelle
Versuchen Sie, das Datum in eine solche Zeichenfolge umzuwandeln?
Ich würde eine Funktion dafür erstellen und sie, obwohl sie etwas umstritten ist, dem Date-Prototyp hinzufügen. Wenn Sie damit nicht vertraut sind, können Sie es als eigenständige Funktion verwenden und das Datum als Parameter übergeben.
Wenn Sie es in UTC-Zeit benötigt haben, ersetzen Sie einfach alle get * -Funktionen durch getUTC *, z. B.: GetUTCFullYear, getUTCMonth, getUTCHours ... und fügen Sie am Ende einfach "+00: 00" anstelle des Zeitzonenversatzes des Benutzers hinzu.
quelle
String(temp)
da der andere Weg ("" + temp
) heutzutage als JSLint-Fehler gemeldet wird.toISOString
Methodesollte in den meisten neueren Browsern funktionieren. es kehrt
2012-07-28T00:00:00.000Z
unter Firefox 6.0 zurückquelle
Meine Empfehlung bei der Arbeit mit Datumsangaben ist, das Datum aus Benutzereingaben in einzelne Felder zu analysieren. Sie können es als volle Saite verwenden, aber Sie spielen mit dem Feuer.
JavaScript kann zwei gleiche Daten in unterschiedlichen Formaten unterschiedlich behandeln.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse
Mach niemals so etwas wie:
Erstellen Sie ein Datumsobjekt, nachdem Sie Ihr Datum aus Benutzereingaben in die einzelnen Felder analysiert haben. Sobald das Datumsobjekt erstellt wurde, konvertieren Sie es in UTC, indem Sie den Zeitzonenversatz hinzufügen. Ich kann nicht betonen, wie wichtig es ist, den Versatz vom Datumsobjekt aufgrund der Sommerzeit zu verwenden (dies ist jedoch eine weitere Diskussion, um zu zeigen, warum).
Jetzt können Sie das Datum in UTC-Zeit an den Server übergeben. Auch hier würde ich dringend empfehlen, keine Datumszeichenfolgen zu verwenden. Übergeben Sie es entweder an den Server, der auf die niedrigste Granularität heruntergebrochen ist, die Sie benötigen, z. B. Jahr, Monat, Tag, Minute oder als Wert wie Millisekunden aus der Unix-Epoche.
quelle
Wenn Sie viel mit Daten zu tun haben, lohnt es sich, moment.js ( http://momentjs.com ) zu verwenden. Die Methode zur Konvertierung in UTC wäre:
Sie können das Format verwenden, um Ihr Datum in ein beliebiges Format zu ändern:
Momentan gibt es auch Offset-Optionen, aber es gibt eine zusätzliche ergänzende Bibliothek für den Umgang mit Zeitzonen ( http://momentjs.com/timezone/ ). Die Zeitumrechnung wäre so einfach:
quelle
moment(yourTime).utc()
undmoment.utc(yourTime)
? Ich benutze normalerweise letzteres.Meine Lösung behält das Datum bei, unabhängig davon, 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 morgens anrufen.
Sie erstellen diese Aufgabe 5 Tage vor (20. Juni), während Sie in China sind.
Am selben Tag fliegen Sie dann für einige 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 innerhalb von 30 Minuten eine Benachrichtigung über die Aufgabe erhalten sollten (obwohl es bereits 13:30 Uhr in China ist, wo Sie sich bei der Erstellung des waren Aufgabe)
Die Aufgabe ignoriert also die Zeitzone. Es bedeutet "Ich möchte es um 8 Uhr morgens in der Zeitzone tun, in der ich mich befinde".
Ich sage: "Ich nehme an, Sie sind immer in der Londoner Zeitzone - UTC."
Was es bedeutet ist - wenn der Benutzer ein Datum in seiner Zeitzone auswählt - konvertiere ich dieses Datum in das gleiche Datum in UTC. dh. Sie wählen 8 Uhr in China, aber ich konvertiere es in 8 Uhr 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. Es bleibt jedoch so konstant, dass es sich so anfühlt, als ob Sie sich immer in derselben Zeitzone befinden.
Schreiben wir einen Code:
Erstens - wir haben zwei Hauptfunktionen zum Konvertieren von / nach UTC, wobei die Zeitzone ignoriert wird:
Dann speichere / lese ich dieses Datum wie folgt:
quelle
Ich habe gerade entdeckt, dass die 1.2.3-Version von Steven Levithans date.format.js genau das tut, was ich will. Sie können eine Formatzeichenfolge für ein JavaScript-Datum angeben und diese von der Ortszeit in UTC konvertieren. Hier ist der Code, den ich jetzt verwende:
quelle
Ich habe festgestellt, dass das Parsen des jQuery Globalization Plugin- Datums am besten funktioniert. Andere Methoden hatten browserübergreifende Probleme und Dinge wie date.js wurden seit einiger Zeit nicht mehr aktualisiert.
Sie benötigen auch keinen datePicker auf der Seite. Sie können einfach etwas Ähnliches wie das in den Dokumenten angegebene Beispiel aufrufen:
quelle
Diese Funktion funktioniert wunderbar für mich.
quelle
Verwenden der UTC-Methode moment.js ;
quelle
Dadurch erhalten Sie das richtige UTC-Datum und die richtige UTC-Uhrzeit.
Das liegt daran
getTimezoneOffset()
, dass Sie den Zeitzonenunterschied in Minuten erhalten. Ich empfehle Ihnen, dies nicht zu verwenden,toISOString()
da sich die Ausgabe in der Zeichenfolge befindet. Daher können Sie das Datum in Zukunft nicht mehr ändernquelle
Das habe ich in der Vergangenheit getan:
quelle
Wenn Sie ein Datumsobjekt benötigen
Nur Datumszeichenfolge übergeben Datum setzt voraus, dass die Zeit um 00:00 Uhr nach Zeitzone verschoben ist:
Wenn Sie aktuelle Stunden und Minuten hinzufügen, erhalten Sie das richtige Datum:
quelle
Wenn Sie sich Ihre Frage ansehen, ist klar, dass Sie nur den Datumsbereich zur weiteren Nachbearbeitung an Ihr Backend senden möchten.
Ich gehe davon aus, dass Sie die Standarddatenrichtlinien einhalten, die erwarten, dass die Daten in einem bestimmten Format vorliegen. Zum Beispiel verwende ich ODATA, eine RESTfull-API, die erwartet, dass Datums- und Uhrzeitobjekte das folgende Format haben:
Dies kann leicht über das unten angegebene Snippet erreicht werden (Bitte ändern Sie das Format gemäß Ihren Anforderungen).
var mydate;//assuming this is my date object which I want to expose var UTCDateStr = mydate.getUTCFullYear() + "-" + mydate.getUTCMonth() + "-" + mydate.getUTCDate() + "T00:00:00";
Wenn Sie sich andererseits in einer Situation befinden, in der Sie ein Datum von Ihrem Backend erhalten haben und der Browser dieses in Ihr lokales Datum konvertiert. Wenn Sie dagegen am UTC-Datum interessiert sind, können Sie Folgendes ausführen: -
var mydate;//assuming this is my date object which I want to expose var UTCDate = new Date(mydate);/*create a copy of your date object. Only needed if you for some reason need the original local date*/ UTCDate.setTime(UTCDate.getTime() + UTCDate.getTimezoneOffset() * 60 * 1000);
Das obige Code-Snippet addiert / subtrahiert im Wesentlichen die vom Browser addierte / subtrahierte Zeit basierend auf der Zeitzone.
Wenn ich mich beispielsweise in EST (GMT-5) befinde und mein Dienst ein Datums- / Uhrzeitobjekt zurückgibt = Mi Aug 17 2016 00:00:00 GMT-0500, subtrahiert mein Browser automatisch den Zeitzonenversatz (5 Stunden), um meine Ortszeit zu erhalten. Wenn ich also versuche, die Zeit abzurufen, bekomme ich Mi Aug 16 2016 19:00:00 GMT-0500. Dies verursacht viele Probleme. Es gibt viele Bibliotheken, die dies definitiv einfacher machen, aber ich wollte den reinen JS-Ansatz teilen.
Weitere Informationen finden Sie unter: http://praveenlobo.com/blog/how-to-convert-javascript-local-date-to-utc-and-utc-to-local-date/ woher ich meine habe Inspiration.
Hoffe das hilft!
quelle
Diese Methode gibt Ihnen:
2017-08-04T11:15:00.000+04:30
und Sie können die Zonenvariable ignorieren , um sie einfach abzurufen2017-08-04T11:15:00.000
.quelle
Mit dem Moment-Paket können Sie einfach eine Datumszeichenfolge von UTC in ein neues Datumsobjekt konvertieren:
Dies ist besonders hilfreich, wenn Ihr Server die Zeitzone nicht unterstützt und Sie das UTC-Datum immer auf dem Server speichern und als neues Datumsobjekt zurückerhalten möchten. Der obige Code hat für meine Anforderung eines ähnlichen Problems funktioniert, für das dieser Thread bestimmt ist. Hier teilen, damit es anderen helfen kann. Ich sehe in keiner Antwort genau die obige Lösung. Vielen Dank.
quelle
const event = new Date ();
console.log (event.toUTCString ());
quelle
Ich weiß, dass diese Frage alt ist, aber ich habe mich mit demselben Problem befasst. Eine Option wäre, stattdessen date.valueOf () an den Server zu senden. Die Funktion valueOf () des Javascript-Datums sendet die Anzahl der Millisekunden seit dem 1. Januar 1970 UTC um Mitternacht.
Wert von()
quelle
So musste ich es also machen, weil ich immer noch wollte, dass ein JavaScript-Datumsobjekt als Datum manipuliert wird, und leider erfordern viele dieser Antworten, dass Sie zu einer Zeichenfolge gehen.
quelle
Garn Moment hinzufügen
quelle
Noch einfacher
quelle
setTime
verlässt sich daraufnew Date
, was Sie nicht einschließen. Bitte vervollständigen Sie die Antwort.