519 Stimmen

Erzeugen eines Datums mit einer bestimmten Zeitzone ohne Verwendung einer String-Darstellung

Ich habe eine Webseite mit drei Dropdown-Listen für Tag, Monat und Jahr. Wenn ich das JavaScript verwende Date Konstruktor, der Zahlen annimmt, dann erhalte ich eine Date Objekt für meine aktuelle Zeitzone:

new Date(xiYear, xiMonth, xiDate)

Geben Sie das richtige Datum an, aber aufgrund der Sommerzeit wird dieses Datum für GMT+01:00 gehalten.

Das Problem dabei ist, dass ich dann diese Date an eine Ajax-Methode, und wenn das Datum auf dem Server deserialisiert wird, wurde es in GMT umgewandelt und hat dadurch eine Stunde verloren, wodurch sich der Tag um eine Stunde nach hinten verschiebt. Jetzt könnte ich nur den Tag, Monat und Jahr einzeln in die Ajax-Methode übergeben, aber es scheint, dass es einen besseren Weg sein sollte.

Die akzeptierte Antwort wies mich in die richtige Richtung, aber nur mit setUTCHours() von selbst verändert:

Apr 5th 00:00 GMT+01:00 

まで

Apr 4th 23:00 GMT+01:00

Dann musste ich auch noch das UTC-Datum, den Monat und das Jahr einstellen, um am Ende Folgendes zu erhalten

Apr 5th 01:00 GMT+01:00

was ich auch wollte.

22 Stimmen

Wenn die akzeptierte Antwort Sie zwar in die richtige Richtung führt, aber Ihre Frage nicht beantwortet, sollte sie meiner Meinung nach nicht die akzeptierte Antwort sein. Die Antwort sollte die gestellte Frage beantworten.

8voto

Drew LeSueur Punkte 17709

Vielleicht hilft dies jemandem, setzen Sie UTC an das Ende dessen, was Sie an den neuen Konstruktor übergeben

Zumindest in Chrom kann man sagen var date = new Date("2014-01-01 11:00:00 UTC")

1 Stimmen

Gibt bei Safari "Ungültiges Datum" zurück

1 Stimmen

Ersetzen Sie "UTC" durch +0000 (das Leerzeichen zwischen 00 und UTC muss entfernt werden) und dies funktioniert sowohl mit Firefox als auch mit Chrome. Bei Safari bin ich mir allerdings nicht sicher (Referenz: stackoverflow.com/a/17545854/1273587 )

7voto

Vinay Vemula Punkte 3467

Einzeilige Lösung

new Date(new Date(1422524805305).getTime() - 330*60*1000)

Verwenden Sie anstelle von 1422524805305 den Zeitstempel in Millisekunden Verwenden Sie anstelle von 330 den Zeitzonen-Offset in Minuten gegenüber GMT (z.B. Indien +5:30 ist 5*60+30 = 330 Minuten)

7 Stimmen

Dieser Code wird auf dem Client ausgeführt, was bedeutet, dass die Zeitzone für die Benutzer an verschiedenen Standorten unterschiedlich ist. Diese Lösung würde voraussetzen, dass jeder, der sie benötigt, in der gleichen Zeitzone lebt (Ihrer).

0 Stimmen

@Kevin Beal in diesem Fall einfach getTimezoneOffset verwenden

0 Stimmen

@KevinBeal und warum ich deinen Kommentar nicht gelesen habe, bevor ich diesen Code benutzt habe ...

5voto

Barry Franklin Punkte 1673

Der einfachste Weg, den ich gefunden habe, um das richtige Datum zu erhalten, ist die Verwendung von datejs.

http://www.datejs.com/

Ich erhalte meine Daten über Ajax in diesem Format als String: '2016-01-12T00:00:00'

var yourDateString = '2016-01-12T00:00:00';
var yourDate = new Date(yourDateString);
console.log(yourDate);
if (yourDate.getTimezoneOffset() > 0){
    yourDate = new Date(yourDateString).addMinutes(yourDate.getTimezoneOffset());
}
console.log(yourDate);

Auf der Konsole wird stehen:

Mon Jan 11 2016 19:00:00 GMT-0500 (Eastern Standard Time)

Tue Jan 12 2016 00:00:00 GMT-0500 (Eastern Standard Time)

https://jsfiddle.net/vp1ena7b/3/

Die 'addMinutes' kommt von datejs, könnte man wahrscheinlich tun dies in reinen js auf eigene Faust, aber ich hatte bereits datejs in meinem Projekt, so fand ich einen Weg, um es zu verwenden, um die richtigen Daten zu erhalten.

Ich dachte, dies könnte jemandem helfen...

0 Stimmen

Ich habe alle Methoden ausprobiert, und dies war die einzige, mit der ich Mitternacht erreichen konnte, was ich auch wollte!

4voto

Marco Dal Zovo Punkte 370

Dieser Code gibt Ihre Datum Objekt formatiert mit dem Browser-Zeitzone .

Date.prototype.timezone = function () {
    this.setHours(this.getHours() + (new Date().getTimezoneOffset() / 60));
    return this;
}

Editar:

Um die Date-API nicht zu verschmutzen, kann die obige Funktion in eine Utility-Funktion umgewandelt werden. Die Funktion nimmt ein Date-Objekt entgegen und gibt ein verändertes Date-Objekt zurück.

function setTimeZone(date) {
    date.setHours(date.getHours() + (new Date().getTimezoneOffset() / 60));
    return date;
}

9 Stimmen

Nein zur Erweiterung nativer Objekte

4voto

agm1984 Punkte 11998

Hier ist eine Funktion, die Sie verwenden können, um ein Datumsobjekt zu erhalten:

const getUTCDate = (date) => {
    const d = new Date(date);
    const utcDate = new Date(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate());
    return utcDate;
}

const string = '1930-08-12T00:00:00.000000Z';

const utcDate = getUTCDate(string);

// returns Tue Aug 12 1930 00:00:00 GMT-0800 (Pacific Daylight Time)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X