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.

23voto

ChewOnThis_Trident Punkte 1987

Ich weiß, das ist alt, aber wenn es Ihnen hilft, könnten Sie Moment und Moment-Zeitzone verwenden. Wenn Sie sie noch nicht gesehen haben, schauen Sie mal rein.

http://momentjs.com/timezone/

http://momentjs.com/

zwei wirklich praktische Bibliotheken zur Zeitmanipulation.

20voto

Norman Gray Punkte 11293

Wenn Sie mit dem etwas anderen, aber verwandten Problem der Erstellung eines Javascript-Datumsobjekts aus Jahr, Monat, Tag, ... umgehen wollen, einschließlich Zeitzone - das heißt, wenn Sie eine Zeichenkette in ein Datum umwandeln wollen, müssen Sie offenbar einen wahnsinnig komplizierten Tanz aufführen:

// parseISO8601String : string -> Date
// Parse an ISO-8601 date, including possible timezone,
// into a Javascript Date object.
//
// Test strings: parseISO8601String(x).toISOString()
// "2013-01-31T12:34"              -> "2013-01-31T12:34:00.000Z"
// "2013-01-31T12:34:56"           -> "2013-01-31T12:34:56.000Z"
// "2013-01-31T12:34:56.78"        -> "2013-01-31T12:34:56.780Z"
// "2013-01-31T12:34:56.78+0100"   -> "2013-01-31T11:34:56.780Z"
// "2013-01-31T12:34:56.78+0530"   -> "2013-01-31T07:04:56.780Z"
// "2013-01-31T12:34:56.78-0330"   -> "2013-01-31T16:04:56.780Z"
// "2013-01-31T12:34:56-0330"      -> "2013-01-31T16:04:56.000Z"
// "2013-01-31T12:34:56Z"          -> "2013-01-31T12:34:56.000Z"
function parseISO8601String(dateString) {
    var timebits = /^([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2})(?::([0-9]*)(\.[0-9]*)?)?(?:([+-])([0-9]{2})([0-9]{2}))?/;
    var m = timebits.exec(dateString);
    var resultDate;
    if (m) {
        var utcdate = Date.UTC(parseInt(m[1]),
                               parseInt(m[2])-1, // months are zero-offset (!)
                               parseInt(m[3]),
                               parseInt(m[4]), parseInt(m[5]), // hh:mm
                               (m[6] && parseInt(m[6]) || 0),  // optional seconds
                               (m[7] && parseFloat(m[7])*1000) || 0); // optional fraction
        // utcdate is milliseconds since the epoch
        if (m[9] && m[10]) {
            var offsetMinutes = parseInt(m[9]) * 60 + parseInt(m[10]);
            utcdate += (m[8] === '+' ? -1 : +1) * offsetMinutes * 60000;
        }
        resultDate = new Date(utcdate);
    } else {
        resultDate = null;
    }
    return resultDate;
}

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 dem UTC-"Gebietsschema", und es nicht standardmäßig das lokale ist), und wenden dann manuell den angegebenen Zeitzonen-Offset an.

Wäre es nicht schön gewesen, wenn jemand tatsächlich Gedanken über das Javascript Datum Objekt für mehr als, oooh, fünf Minuten....

1 Stimmen

Danke für die tolle funktion! das einzige, was ich ändern würde, ist die unterstützung für den doppelpunkt in der zeitzone offset. var timebits = /^([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2})(?::([0-9]*)( \. [0-9]*)?)‌​?(?:([+-])([0-9]{2}[‌​:]?)([0-9]{2}))?/;

2 Stimmen

Sie haben darüber nachgedacht; leider waren die "sie" die Java-Sprachentwickler, da JS die Date-Klasse von Java für seine ursprüngliche Implementierung einfach kopiert hat.

0 Stimmen

@Xanthir Oooh, Sie haben Recht, und ich hatte vergessen, wie schrecklich das ursprüngliche Java Date-Objekt war; aber zumindest Java veraltete es und ging weiter, etwas, das Javascript nicht zu tun scheint (es ist eine bizarre Sprache, Javascript: ziemlich niedlich, und nicht annähernd so schrecklich, wie es zunächst zu sein scheint).

14voto

Vijay Lathiya Punkte 933
d = new Date();
utc = d.getTime() + (d.getTimezoneOffset() * 60000);
nd = new Date(utc + (3600000*offset));

offset value base on which location time zone you would like to set 
For India offset value +5.5,
New York offset value -4,
London offset value +1

für alle Standortverschiebungen Wiki Liste der UTC-Zeitverschiebungen

1 Stimmen

Was bedeutet das für New York während der Sommerzeit?

0 Stimmen

Für New York verwenden Sie bitte den Offset-Wert -4

2 Stimmen

Die Verschiebung für New York variiert je nach Sommerzeit. Manchmal ist es -4 und manchmal ist es -5 de.wikipedia.org/wiki/Östliche_Zeitzone

10voto

Tuan Nguyen Punkte 2352
// My clock 2018-07-25, 00:26:00 (GMT+7)
let date = new Date(); // 2018-07-24:17:26:00 (Look like GMT+0)
const myTimeZone = 7; // my timeZone 
// my timeZone = 7h = 7 * 60 * 60 * 1000 (millisecond);
// 2018-07-24:17:26:00 = x (milliseconds)
// finally, time in milliseconds (GMT+7) = x + myTimezone 
date.setTime( date.getTime() + myTimeZone * 60 * 60 * 1000 );
// date.toISOString() = 2018-07-25, 00:26:00 (GMT+7)

0 Stimmen

Wenn Sie Ihren Code erklären und erläutern, wie er das Problem löst, erhöht das die Qualität Ihrer Antwort und hilft den Lernenden.

0 Stimmen

Es funktioniert tatsächlich und ist sehr gut mit Kommentaren dokumentiert. Es ist ein sehr cooler Weg, um ein korrektes neues Date(date).toISOString() zu erzeugen. Und Sie können sogar den Offset durch Code

8voto

rinjan Punkte 540

GetTimeZoneOffset ist minus für UTC + z.

var d = new Date(xiYear, xiMonth, xiDate);
if(d.getTimezoneOffset() > 0){
    d.setTime( d.getTime() + d.getTimezoneOffset()*60*1000 );
}

1 Stimmen

Ein kleiner Fehler, != 0 und nicht > 0. Ich habe Folgendes verwendet

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