Ich habe eine Webseite mit drei Dropdowns für Tag, Monat und Jahr. Wenn ich den JavaScript- Date
Konstruktor verwende, der Zahlen akzeptiert, erhalte ich ein Date
Objekt für meine aktuelle Zeitzone:
new Date(xiYear, xiMonth, xiDate)
Geben Sie das richtige Datum an, aber es wird angenommen, dass das Datum aufgrund der Sommerzeit GMT + 01: 00 ist.
Das Problem hierbei ist, dass ich dies dann Date
an eine Ajax-Methode übergebe. Wenn das Datum auf dem Server deserialisiert wird, wurde es in GMT konvertiert und hat so eine Stunde verloren, die den Tag um eins zurückversetzt. Jetzt könnte ich Tag, Monat und Jahr einzeln in die Ajax-Methode übergehen, aber es scheint, dass es einen besseren Weg geben sollte.
Die akzeptierte Antwort wies mich in die richtige Richtung, aber die Verwendung setUTCHours()
allein änderte sich:
Apr 5th 00:00 GMT+01:00
zu
Apr 4th 23:00 GMT+01:00
Ich musste dann auch das UTC-Datum, den Monat und das Jahr einstellen, um am Ende zu landen
Apr 5th 01:00 GMT+01:00
Welches ist, was ich wollte.
quelle
Antworten:
Mit
.setUTCHours()
dieser Funktion können Datumsangaben tatsächlich in UTC-Zeit festgelegt werden, sodass Sie UTC-Zeiten im gesamten System verwenden können.Sie können es jedoch nicht mit UTC im Konstruktor festlegen, es sei denn, Sie geben eine Datumszeichenfolge an.Mit können
new Date(Date.UTC(year, month, day, hour, minute, second))
Sie ein Datumsobjekt aus einer bestimmten UTC-Zeit erstellen.quelle
Diese Antwort ist speziell auf die ursprüngliche Frage zugeschnitten und gibt nicht die Antwort, die Sie unbedingt erwarten. Insbesondere möchten einige Leute den Zeitzonenversatz subtrahieren, anstatt ihn hinzuzufügen. Denken Sie jedoch daran, dass der springende Punkt dieser Lösung darin besteht, das Datumsobjekt von Javascript für eine bestimmte Deserialisierung zu hacken, um nicht in allen Fällen korrekt zu sein.
quelle
*60*1000
ist in diesem Fall klarer; Mit anderen Worten, es ist ziemlich selbstverständlich, warum es dort ist.Ich glaube, Sie brauchen die Funktion createDateAsUTC (bitte vergleichen Sie mit convertDateToUTC )
quelle
date
in die UTC-Zeitzone, aber der zweite scheint nichts Nützliches zu tun? (gibt das gleiche Datum zurück wiedate
)Date
Objekt spiegelt immer die UTC-basierte Unix-Epoche und die lokale Zeitzone wider . Das Symptom tritt auf, wenn SietoString
das resultierende Datumsobjekt aufrufen und trotzdem die lokale Zeitzone sehen, obwohl Sie erwartet haben, dass sie in UTC vorliegt.Date
Objekt. Eine andere Möglichkeit, dies hier zu sehen, besteht darin,Date.UTC
UTC-basierte Werte zu erwarten und diese lokalen Zeitwerte einzugeben und umgekehrt mit demDate
Konstruktor.Stellen Sie einfach die Zeitzone ein und kehren Sie entsprechend zurück
quelle
Ich glaube nicht, dass dies möglich ist - es gibt keine Möglichkeit, die Zeitzone für ein Datumsobjekt festzulegen, nachdem es erstellt wurde.
Und in gewisser Weise macht dies Sinn - konzeptionell (wenn vielleicht nicht in der Umsetzung); per http://en.wikipedia.org/wiki/Unix_timestamp (Schwerpunkt Mine):
Sobald Sie eine erstellt haben, wird sie einen bestimmten Punkt in "Echtzeit" darstellen. Die Zeitzone ist nur relevant, wenn Sie diesen abstrakten Zeitpunkt in eine für Menschen lesbare Zeichenfolge konvertieren möchten.
Daher ist es sinnvoll, dass Sie nur die tatsächliche Zeit ändern können, die das Datum im Konstruktor darstellt. Leider scheint es keine Möglichkeit zu geben, eine explizite Zeitzone zu übergeben - und der Konstruktor, den Sie aufrufen (wohl richtig), übersetzt Ihre "lokalen" Zeitvariablen in GMT, wenn er sie kanonisch speichert - daher gibt es keine Möglichkeit, die zu verwenden
int, int, int
Konstruktor für zu verwenden GMT-Zeiten.Auf der positiven Seite ist es trivial, nur den Konstruktor zu verwenden, der stattdessen einen String verwendet. Sie müssen nicht einmal den numerischen Monat in einen String konvertieren (zumindest in Firefox), also hatte ich gehofft, dass eine naive Implementierung funktionieren würde. Nach dem Ausprobieren funktioniert es jedoch erfolgreich in Firefox, Chrome und Opera, schlägt jedoch in Konqueror ("Ungültiges Datum"), Safari ("Ungültiges Datum") und IE ("NaN") fehl. Ich nehme an, Sie hätten nur ein Sucharray, um den Monat in eine Zeichenfolge umzuwandeln, wie folgt:
quelle
Ich weiß, dass dies alt ist, aber wenn es hilft, können Sie Moment und Moment Zeitzone verwenden. Wenn Sie sie nicht gesehen haben, schauen Sie sie sich an.
http://momentjs.com/timezone/
http://momentjs.com/
zwei wirklich praktische Zeitmanipulationsbibliotheken.
quelle
Wenn Sie sich mit dem etwas anderen, aber verwandten Problem befassen möchten, ein Javascript-Datumsobjekt aus Jahr, Monat, Tag, ... einschließlich Zeitzone zu erstellen, dh wenn Sie eine Zeichenfolge in ein Datum analysieren möchten, dann sind Sie es müssen anscheinend einen ärgerlich komplizierten Tanz machen:
Das heißt, Sie erstellen eine 'UTC-Zeit' unter Verwendung des Datums ohne Zeitzone (damit Sie wissen, in welchem Gebietsschema es sich befindet, nämlich im UTC-Gebietsschema, und es ist nicht standardmäßig das lokale Gebietsschema), und wenden dann manuell den angegebenen Zeitzonenversatz an.
Wäre es nicht schön gewesen , wenn jemand tatsächlich hatte gedacht , über das Javascript Date - Objekt für mehr als, oooh, 5 Minuten ....
quelle
für alle Standortversätze Wiki Liste der UTC- Zeitversätze
quelle
getTimeZoneOffset ist für UTC + z minus.
quelle
Dies kann jemandem helfen, UTC an das Ende dessen zu setzen, was Sie an den neuen Konstruktor übergeben
Zumindest in Chrom kann man sagen
var date = new Date("2014-01-01 11:00:00 UTC")
quelle
+0000
( beachten Sie, dass der Abstand zwischen 00 und UTC entfernt werden muss), und dies funktioniert sowohl in Firefox als auch in Chrome. Ich bin mir jedoch nicht sicher für Safari. (Referenz: stackoverflow.com/a/17545854/1273587 )Einzeilige Lösung
Verwenden Sie anstelle von 1422524805305 den Zeitstempel in Millisekunden. Verwenden Sie anstelle von 330 Ihren Zeitzonenversatz in Minuten. GMT (zB Indien +5: 30 ist 5 * 60 + 30 = 330 Minuten)
quelle
quelle
Der einfachste Weg, das richtige Datum zu finden, ist die Verwendung von datejs.
http://www.datejs.com/
Ich erhalte meine Daten über Ajax in diesem Format als Zeichenfolge: '2016-01-12T00: 00: 00'
Die Konsole lautet:
Montag, 11. Januar 2016, 19:00:00 GMT-0500 (Eastern Standard Time)
Di Jan 12 2016 00:00:00 GMT-0500 (Eastern Standard Time)
https://jsfiddle.net/vp1ena7b/3/
Die 'addMinutes' stammen von datejs. Sie können dies wahrscheinlich in reinen js selbst tun, aber ich hatte bereits datejs in meinem Projekt, sodass ich einen Weg gefunden habe, damit die richtigen Daten zu erhalten.
Ich dachte, das könnte jemandem helfen ...
quelle
jeder Kilometerstand in
quelle
Dieser Code gibt Ihr Date-Objekt zurück, das mit der Zeitzone des Browsers formatiert ist .
Bearbeiten:
Um zu vermeiden, dass die Datums-API verschmutzt wird, kann die obige Funktion in eine Dienstprogrammfunktion umgewandelt werden. Die Funktion nimmt ein Date-Objekt und gibt ein mutiertes Date-Objekt zurück.
quelle
Die beste Lösung, die ich daraus gesehen habe, kam von
http://www.codingforums.com/archive/index.php/t-19663.html
Druckzeitfunktion
Vollständiges Codebeispiel
quelle
Wenn Sie den Zeitunterschied zwischen zwei Daten überprüfen möchten, können Sie einfach überprüfen, ob die zweite Zeitzone von Ihrer ersten gewünschten Zeitzone kleiner oder größer ist, und eine Zeit subtrahieren oder addieren.
quelle
GMT -03: 00 Beispiel
Oder auch
quelle
Das hat bei mir funktioniert. Ich bin mir nicht sicher, ob es eine gute Idee ist.
quelle
Ich habe das timezone-js-Paket verwendet.
quelle
Dies ist die beste Lösung
Verwenden von:
Code:
Kaffeeversion:
quelle