Ein Date mit einem set timezone (Zeitzone einstellen, ohne Verwendung einer string-Repräsentation
Ich habe eine web-Seite mit drei dropdowns für Tag, Monat und Jahr. Wenn ich den JavaScript - Date
Konstruktor, zahlen, bekomme ich dann Date
Objekt für meine aktuelle Zeitzone:
new Date(xiYear, xiMonth, xiDate)
Geben Sie das richtige Datum, aber es denkt, dass Datum, GMT+01:00 wegen der Zeitumstellung.
Hier das problem, dass ich dann an diesem Date
einer Ajax-Methode und, wenn das Datum deserialised auf dem server wurde umgestellt auf GMT und so verloren eine Stunde, die bewegt sich der Tag wieder durch ein.
Jetzt könnte ich geben Sie nur den Tag, Monat und Jahr einzeln in die Ajax-Methode, aber es scheint, dass es sollte einen besseren Weg geben.
Akzeptierte Antwort wies mich in die richtige Richtung, jedoch nur mit setUTCHours()
von selbst geändert:
Apr 5th 00:00 GMT+01:00
zu
Apr 4th 23:00 GMT+01:00
Ich dann auch hatte, um die UTC-Datum, Monat und Jahr zu Ende mit
Apr 5th 01:00 GMT+01:00
ist es, was ich wollte.
- Wenn die akzeptierte Antwort zeigte Sie in die richtige Richtung, aber nicht die Antwort auf Ihre Frage, ich würde behaupten, es sollte nicht die akzeptierte Antwort. Die Antwort sollte auch die Antwort auf die gestellte Frage.
- können Sie erklären, Ihre Bearbeitung der Frage-Titel? Sie haben es nicht mehr eine Frage, und weniger spezifisch. Ich überlege mir, ins Rollen zurück.
- was meinst du mit 'weniger genau'?
- vor allem das entfernen von "JavaScript", ich weiß, wir haben tags auf der Website, aber ich Stelle mir die Frage-Titel ist wichtig für Suchmaschinen und für Menschen, die sich auf die Suchergebnisse. (Auch das entfernen "mit" macht der Titel mehr zweideutig)
- werfen Sie einen Blick auf dieses Meta-Antwort. Speziell:
You absolutely do NOT have to use any one of the following forms: [question title] in [tag]
,Stack Exchange is optimized so that tags are indexed by search engines
undthe system automatically prepends the most commonly used tag to the question title
. Wenn Sie glauben, dass das entfernen "verwenden" lässt es zweideutig, dann fügen wir es wieder; ich habe gerade versucht, den Titel kurz und prägnant, indem man die unbedingt benötigt Wortlaut nur. - ah, ich wusste nicht, über, die, schön. Ich neigen auf die Seite meta.stackexchange.com/questions/180100/... aber es hat weniger upvotes so glücklich, verlassen Sie die Titel.
Du musst angemeldet sein, um einen Kommentar abzugeben.
mit
.setUTCHours()
es wäre tatsächlich möglich, Termine in UTC-Zeit, die Ihnen erlauben würde, zu verwenden UTC-Zeiten im gesamten system.Sie können nicht legen Sie es über UTC in den Konstruktor obwohl, es sei denn, Sie geben ein Datum-string.Mit
new Date(Date.UTC(year, month, day, hour, minute, second))
können Sie ein Date-Objekt aus einem bestimmten UTC-Zeit.Diese Antwort ist speziell auf die ursprüngliche Frage und nicht die Antwort geben, die Sie unbedingt zu erwarten. In bestimmten, einige Leute wollen, um zu subtrahieren des timezone offset, anstatt es hinzuzufügen. Denken Sie jedoch daran, dass der springende Punkt bei dieser Lösung ist hack javascript date-Objekt für einen bestimmten Deserialisierung, nicht richtig zu sein in allen Fällen.
*60000
statt*60*1000
🙂*60*1000
ist klarer in diesem Fall; in anderen Worten, es ist ziemlich offensichtlich, warum es da ist.d = new Date(2014, 07, 26, 11)
gibt mirTue Aug 26 2014 11:00:00 GMT-0700 (PDT)
,d.getTimezoneOffset()
zurück420
, so dass die transformation vorgeschlagen, in dieser Antwort stellt sich die lokale Vertretung vond
inTue Aug 26 2014 18:00:00 GMT-0700 (PDT)
(7 Stunden später, genau zeigt, dass 11 am PDT ist 6 pm GMT). Außer, dass lästigen "-0700 (PDT)" suffix zeigt der 420-sec timezone offset ist immer noch da, und:d.toISOString()
zurück2014-08-27T01:00:00.000Z
.new Date(Date.UTC(y, m,d));
Sie wirklich brauchen, zu subtrahieren Zeitzone, nicht hinzufügen.Ich glaube, Sie müssen die createDateAsUTC - Funktion (vergleichen Sie bitte mit convertDateToUTC)
date
in der UTC-Zeitzone, aber der zweite scheint zu sein, nichts zu tun nützlich? (gibt gleiche Datum wiedate
)Date
Objekt beziehen sich immer auf die UTC-basierten unix-Epoche, und die local Zeitzone. Das symptom ist offensichtlich, wenn Sie anrufentoString
auf das resultierende Datum-Objekt und sehe immer noch die lokale Zeitzone, obwohl Sie es erwartet in UTC.Date
Objekt. Ein anderer Weg, um dies zu sehen ist hier, dassDate.UTC
erwartet UTC-basierte Werte, und du bist der Einspeisung von lokalen Zeitwerte und Umgekehrt mit derDate
Konstruktor.Glaube ich nicht, das ist möglich - es gibt keine Möglichkeit, die Zeitzone setzen auf ein Date-Objekt, nachdem es erstellt wurde.
Art und Weise und das macht Sinn - begrifflich (wenn auch vielleicht nicht in der Umsetzung); pro http://en.wikipedia.org/wiki/Unix_timestamp (Hervorhebung von mir):
Einmal haben Sie gebaut, Sie stellen einen bestimmten Punkt in der "realen" Zeit. Die Zeitzone ist nur dann relevant, wenn Sie konvertieren wollen, daß die abstrakte Zeit-Punkt in eine lesbare Zeichenfolge.
So macht es Sinn, Sie würden nur in der Lage sein, um die aktuelle Zeit, das Datum steht in den Konstruktor. Leider scheint es, dass es keine Möglichkeit gibt, zu passieren, in eine explizite Zeitzone und der Konstruktor, die Sie anrufen (wohl korrekt) übersetzt Ihre "lokale" Zeit-Variablen in GMT, wenn er speichert diese kanonisch - es gibt also keine Möglichkeit, das
int, int, int
Konstruktor für die GMT-Zeiten.Auf der plus-Seite, ist es eine triviale Angelegenheit, um Sie nur den Konstruktor, der eine Zeichenfolge annimmt, statt. Sie nicht sogar müssen, konvertieren Sie die numerischen Monat in einen String (im Firefox zumindest), so hoffte ich, eine naive Implementierung funktionieren würde. Aber nach dem Versuch es heraus, dass es erfolgreich funktioniert in Firefox, Chrome und Opera scheitert aber im Konqueror ("Ungültiges Datum") , Safari ("Ungültiges Datum") und IE ("NaN"). Ich nehme an, Sie würden nur ein lookup-array konvertieren im Monat in einen string, etwa so:
Stellen Sie einfach die Zeitzone und Zurück Nach
Ich weiß, das ist alt, aber wenn es dir hilft, könnte moment und moment-Zeit-zone. Wenn Sie noch nicht gesehen, Sie nehmen einen Blick.
http://momentjs.com/timezone/
http://momentjs.com/
beiden wirklich praktisch, Zeit-manipulation Bibliotheken.
Wenn Sie wollen deal mit die etwas andere, aber Verwandte problem der Schaffung eines Javascript Date-Objekts aus Jahr, Monat, Tag, ..., einschließlich Zeitzone – das ist, wenn Sie wollen, um zu analysieren, eine Zeichenfolge in einen Datum – dann ist Sie scheinbar zu tun haben, ein empörend komplizierter Tanz:
Ist, erstellen Sie eine "UTC-Zeit" mit Datum ohne zeitzonenangabe (damit Sie wissen, in welcher Region es ist, nämlich die UTC 'locale', und es ist nicht standardmäßig auf dem lokalen Rechner), und dann manuell gelten die angegebenen Zeitzone offset.
Wäre es nicht schön gewesen, wenn jemand gerade dachte über die Javascript-date-Objekt für mehr als, ach, fünf Minuten....
für alle positions-offset Wiki-Liste der UTC-Zeit-offsets
One-line-Lösung
Statt 1422524805305, verwenden Sie den Zeitstempel in Millisekunden
Statt 330, verwenden Sie Ihre Zeitzone offset in Minuten wrt. GMT (zB Indien +5:30 5*60+30 = 330 Minuten)
Dieser jemand kann helfen, setzen UTC am Ende das, was Sie übergeben, um den neuen Konstruktor
Zumindest in chrome kann man sagen
var date = new Date("2014-01-01 11:00:00 UTC")
+0000
(bemerkt, dass der Raum zwischen 00 und UTC, die entfernt werden müssen) und dies funktioniert auf beiden Firefox und Chrome. Nicht sicher, für Safari wenn.(Referenz: stackoverflow.com/a/17545854/1273587)getTimeZoneOffset minus für UTC + z.
Der einfachste Weg, die ich gefunden habe, um das richtige Datum mit datejs.
http://www.datejs.com/
Bekomme ich meine Termine via Ajax in diesem format string: '2016-01-12T00:00:00'
Konsole Lesen:
Mo Jan 11 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/
Den 'addMinutes" kommt aus datejs, könnten Sie wahrscheinlich tun Sie dies in reinem js auf Ihre eigenen, aber ich hatte bereits datejs in meinem Projekt so fand ich einen Weg, es zu benutzen, um die richtigen Termine.
Ich dachte, dies könnte jemand helfen...
jede Laufleistung in
Diesen code zurück Date-Objekt formatiert mit der browser, timezone.
Beste Lösung die ich gesehen habe, von dieser kam aus
http://www.codingforums.com/archive/index.php/t-19663.html
Druck-Zeit-Funktion
Vollständige Code-Beispiel
Dieser arbeitete für mich. Nicht sicher, ob es eine gute Idee, obwohl.
JS:
Benutzte ich die timezone-js-Paket.
Dies ist die BESTE Lösung
Mit:
Code:
Kaffee-version: