Wie konvertiert man ein JavaScript-Datum in UTC?


590

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?


10
Dies wurde wiederbelebt, da es für mich der größte Google-Hit war und neuere Browser die Unterstützung für UTC-Datumszeichenfolgen integriert haben.
jcomeau_ictx

4
Ich habe die akzeptierte Antwort aktualisiert, um die neue ECMAscript 5 toISOString () -Methode hervorzuheben. Siehe stackoverflow.com/a/11957822/19112
dthrasher

5
Also muss ich mich 2015 mit dem Stringifizieren und Parsen von Daten herumschlagen? lächerlich!
Toolkit

2
Natürlich hast du. Sie können sich niemals darauf verlassen, dass jemand anderes die Arbeit für Sie erledigt :-P Zumindest bis die Welt keine Zeitzonen mehr verwendet und beginnt, Datum und Uhrzeit zu vereinheitlichen.
Erenor Paz

4
"Stardates", vorzugsweise.
Michael Daw

Antworten:


370

Die toISOString()Methode gibt eine Zeichenfolge im vereinfachten erweiterten ISO-Format ( ISO 8601 ) zurück, die immer 24 oder 27 Zeichen lang ist ( YYYY-MM-DDTHH:mm:ss.sssZbzw. ±YYYYYY-MM-DDTHH:mm:ss.sssZ). Die Zeitzone ist immer Null UTC-Offset, wie durch das Suffix " Z" angegeben.

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:

var isoDate = new Date('yourdatehere').toISOString();

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.



2
@TheRebel, der angegebene Anwendungsfall ist, dass er dem Server eine formatierte Zeichenfolge senden muss.
Will Stern

28
@ Will, du hast vollkommen recht, aber - wie die meisten Zuschauer hier annehmen - bin ich aufgrund des Titels hier angekommen und habe nach der allgemeinen Konvertierung von JS-Datum in UTC gesucht, daher fand ich es nützlich, es hier zu erwähnen :)
Orszaczky

4
Seien Sie vorsichtig, wenn Sie diese Methode anwenden! Es wird kein UTC-Datum erstellt. Die vorhandenen Datumsdaten werden unverändert in ein UTC-Format formatiert und mit einer Zeitzone "Z" versehen. Dies ist in 99% der Fälle falsch! Sie müssen das Datum in die GMT-Zeitzone konvertieren, bevor Sie diese Methode verwenden können!
user1944491

5
@ user1944491 Ich denke nicht, dass dies korrekt ist. Laut MDN-Dokumenten toISOStringwird ordnungsgemäß in UTC konvertiert. [toISOString] returns a string in simplified extended ISO format ... The timezone is always zero UTC offsetAuch in dem Beispiel wird der Offset berücksichtigt, wenn toISOString aufgerufen wird
FFF

560

Einfach und dumm

var date = new Date(); 
var now_utc =  Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(),
 date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds());

 return new Date(now_utc);

85
Ich mochte Ihre Idee und habe eine Methode angewendet, die ich schon oft angewendet habe. function convertDateToUTC(date) { return new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds()); }
Tim

21
Der kürzeste Code, den ich mir ausgedacht habe, um das UTC-Datum und die UTC-Uhrzeit zu erhalten, ist das Abschalten der Zeitzone:new Date(new Date().toUTCString().substr(0, 25))
Joelvh

17
Beachten Sie, dass getUTCMonth () die Werte 0 bis 11 zurückgibt. Wenn Sie also den Monat nach Zahlen anstelle einer Zeichenfolge benötigen, ist es hilfreich, +1 auf den Wert zu setzen.
Talvi Watia

19
Das ist Unsinn. Das neue Datum hat einen anderen Wert als Sie tatsächlich möchten. Verwenden Sie einfach now.toUTCSTring()anstelle von (falsch) now_utc.toString().
Bergi

22
Ich würde dies nicht verwenden - mit new Date () erhalten Sie die Zeitzone des Browers. In Chrome 29 und IE10 scheinen Datum und Uhrzeit korrekt zu sein, aber die Zeitzone ist auf die Zeitzone des Browsers eingestellt, was zu Problemen führen kann ...
Sean

207

Hier ist meine Methode:

var now = new Date();
var utc = new Date(now.getTime() + now.getTimezoneOffset() * 60000);

Das resultierende utcObjekt 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.


Ich habe mir dieses Problem angesehen, als mir klar wurde, dass 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 :))
Timothée Boucher

18
Das Hinzufügen des 60000 * Date.getTimezoneOffset () ist falsch! Zunächst müssen Sie sich alle Daten / Zeiten als UTC mit einem Zeitzonenmodifikator für Anzeigezwecke vorstellen. Browser können jedoch abweichen. Date.getTime () gibt jedoch die Anzahl der Millisekunden seit dem 01.01.1970 zurück. Wenn Sie mit dieser Nummer ein neues Datum erstellen, z. B.: New Date (Date.getTime ()); Es wird UTC sein , aber wenn Sie es anzeigen (z. B. über die Chrome Dev Tools-Konsole), scheint es Ihre lokale Zeitzone zu sein.
Aaron Hoffman

15
In meinem Browser wird dadurch eine DateTime erstellt, die nicht UTC ist. Bei Anzeige in meinem Browser wird jedoch eine DateTime in meiner lokalen Zeitzone angezeigt, die die korrekte UTC-Zeit darstellt, wenn die Zeitzoneninformationen ignoriert werden.
Aaron Hoffman

Gotcha, interessanter Punkt. Vergleichen wir now.toString()mit utc.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.
Gras Double

4
Diese Antwort zeigt eine weitere häufige Implementierung der "Epochenverschiebung", die für sich genommen gefährlich ist, da sie in der Nähe von Randfällen wie Sommerzeitübergängen fehlschlagen kann. Nicht empfohlen.
Matt Johnson-Pint

25
Date.prototype.toUTCArray= function(){
    var D= this;
    return [D.getUTCFullYear(), D.getUTCMonth(), D.getUTCDate(), D.getUTCHours(),
    D.getUTCMinutes(), D.getUTCSeconds()];
}

Date.prototype.toISO= function(){
    var tem, A= this.toUTCArray(), i= 0;
    A[1]+= 1;
    while(i++<7){
        tem= A[i];
        if(tem<10) A[i]= '0'+tem;
    }
    return A.splice(0, 3).join('-')+'T'+A.join(':');    
}

Das funktioniert gut. Ich musste nur das "-" in meinen Quelldaten durch "/" ersetzen, um ein JavaScript-Datum zu erstellen, dann konnte ich Ihre toISO () - Funktion aufrufen, um die richtige Ausgabe zu erhalten.
Dthrasher

das funktioniert super. Sie können das Ergebnis auch in jQuery $ .parseDate (...) eingeben, um ein Datumsobjekt zurückzugewinnen, das nach UTC verschoben wurde.
Brian Ellis

23

In ISO konvertieren, ohne Datum / Uhrzeit zu ändern

var now = new Date(); // Fri Feb 20 2015 19:29:31 GMT+0530 (India Standard Time) 
var isoDate = new Date(now.getTime() - now.getTimezoneOffset() * 60000).toISOString();
//OUTPUT : 2015-02-20T19:29:31.238Z

Konvertieren in ISO mit Änderung von Datum / Uhrzeit (Datum / Uhrzeit werden geändert)

isoDate = new Date(now).toISOString();
//OUTPUT : 2015-02-20T13:59:31.238Z 

Geigenlink


Das ist also eine Art Fälschung von UTC? Ich verschiebe mein lokales Datum und es gelingt mir, das Datum und die Uhrzeit, die ich tatsächlich auf meiner PC-Uhr sehe, an den Server zu senden. Beeindruckend. Jedenfalls besser als strinifizieren und analysieren
Toolkit

Auch brauchen Sie nicht .toISOString (), Sie können einfach isoDate an den Server senden
Toolkit

.toISOString () ist einfach und direkt. Das Herausholen des Datums ist ein zusätzlicher Schritt (isoDate ist keine Funktion).
RollerCosta

Müssen Sie den Versatz nicht addieren, anstatt ihn zu subtrahieren? Siehe stackoverflow.com/a/11964609/832230
Acumenus

@ABB Wenn der aktuelle Zeitzonenversatz + ve ist, sollten wir ihn subtrahieren (in unserem Fall IST +5: 30), andernfalls addieren.
RollerCosta

18

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/Date

  • Wenn keine Argumente angegeben werden, erstellt der Konstruktor gemäß den Systemeinstellungen ein JavaScript-Datumsobjekt für das aktuelle Datum und die aktuelle Uhrzeit.
  • Hinweis: Wenn Date als Konstruktor mit mehr als einem Argument aufgerufen wird, stehen die angegebenen Argumente für die Ortszeit. Wenn UTC gewünscht wird, verwenden Sie ein neues Datum ( Date.UTC (...) ) mit denselben Argumenten. (Hinweis: Date.UTC () gibt die Anzahl der Millisekunden seit 1970-01-01 00:00:00 UTC zurück.)

Das 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.


11
Ich habe diesen Code gerade auf Fx und Chrome ausgeführt, er scheint nicht zu funktionieren: Das Ergebnis ist genau das gleiche wie ab new Date(), weder Zeitstempel noch Zeitzone werden geändert
Gras Double

3
Das liegt daran, dass Zeitstempel zeitzonenlos sind. new 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.
Frontendbeauty

7
Soweit ich das beurteilen kann, new Date(new Date().getTime())gibt es genau den gleichen Wert zurück wie new Date(). Können Sie erklären, in welchem ​​Sinne Ihre Antwort einen anderen Wert liefert new Date()?
Kirk Woll

Ich poste diesen Wert auf meinem Server 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 hinzu new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddMilliseconds(1401087600000). Das Ergebnis ist 5/19/2014 7:00:00 AM. GetTime () gibt also anscheinend die Anzahl der Millisekunden einschließlich meines UTC-Offsets an.
xr280xr

1
Es gibt viele Kommentare, die sich beschweren und new Date(new Date().getTime())nicht funktionieren. Ich kann bestätigen, dass new Date(Date.UTC(2019, 8, 27, 0, 0, 0))dies tatsächlich UTC-Zeit erzeugt. Wenn Sie nicht verwenden, erhalten Date.UTC(...)Sie Daten in UTC-Offset in Ihrer Zeitzone.
Alex Barker

15
var myDate = new Date(); // Set this to your date in whichever timezone.
var utcDate = myDate.toUTCString();

1
Das Datumsobjekt muss tatsächlich auf ein Datum festgelegt werden. Oben ist nur ein Beispiel.
James Skidmore

5
Jetzt wird "Do, 04. Juni 2009, 04:10:56 GMT" zurückgegeben, was nicht das im OP erforderliche ISO-Format ist.
Nickf

4
Dies macht es zu einer Zeichenfolge, die kein Datum ist
Anthony

2
Nein, eigentlich sollte es eine Zeichenfolgendarstellung eines Datums gemäß OP sein.
jcomeau_ictx

3
Nach der Konvertierung in UTC wird im Zeichenfolgenformat zurückgegeben, wie auf Methoden wie getMonth (), getDate () usw. zugegriffen werden kann
Sandeep sandy

10

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.)

var now = new Date();
var now_utc = new Date(now.toUTCString().slice(0, -4));

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)


7

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.

Date.prototype.getISOString = function() {
    var zone = '', temp = -this.getTimezoneOffset() / 60 * 100;
    if (temp >= 0) zone += "+";
    zone += (Math.abs(temp) < 100 ? "00" : (Math.abs(temp) < 1000 ? "0" : "")) + temp;

    // "2009-6-4T14:7:32+10:00"
    return this.getFullYear()   // 2009
         + "-"
         + (this.getMonth() + 1) // 6
         + "-"
         + this.getDate()       // 4
         + "T"
         + this.getHours()      // 14
         + ":"
         + this.getMinutes()    // 7
         + ":"
         + this.getSeconds()    // 32
         + zone.substr(0, 3)    // +10
         + ":"
         + String(temp).substr(-2) // 00
    ;
};

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.


1
Dies ist das erste Beispiel, das ich gesehen habe, das versucht, den Zeitzonenversatz zu verarbeiten, also +1 dafür. Ich habe jedoch ein paar Dinge damit gefunden - temp.substr (-2) verursacht einen Fehler, da es sich um eine Zahl und nicht um eine Zeichenfolge handelt. Sie müssen also etwas wie "temp = '' + temp;" zuerst, um es in eine Zeichenfolge zu verwandeln. Außerdem bevorzuge ich meine ISO-Daten mit Nullen - ich denke, dies macht sie standardisierter.
Mick Sear

@ Mick - Ich habe aktualisiert, um diesen Fehler zu beheben. Ich habe verwendet, String(temp)da der andere Weg ( "" + temp) heutzutage als JSLint-Fehler gemeldet wird.
Nickf

Dies ist jetzt als toISOStringMethode
Bergi

7
date = '2012-07-28'; stringdate = new Date(date).toISOString();

sollte in den meisten neueren Browsern funktionieren. es kehrt 2012-07-28T00:00:00.000Zunter Firefox 6.0 zurück


7

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:

new Date('date as text');

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).

var year = getFullYear('date as text');
var month = getMonth('date as text');
var dayOfMonth = getDate('date as text');

var date = new Date(year, month, dayOfMonth);

var offsetInMs = ((date.getTimezoneOffset() * 60)  // Seconds
                 * 1000);                          //  Milliseconds

var utcDate = new Date(date.getTime + offsetInMs);

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.


Zu Ihrer Information getYear wird aus den Webstandards developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… entfernt
Ghan

6

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:

moment(yourTime).utc()

Sie können das Format verwenden, um Ihr Datum in ein beliebiges Format zu ändern:

moment(yourTime).utc().format("YYYY-MM-DD")

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:

moment.tz(yourUTCTime, "America/New_York")

Was ist der Unterschied zwischen moment(yourTime).utc()und moment.utc(yourTime)? Ich benutze normalerweise letzteres.
ps0604

5

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:

export function convertLocalDateToUTCIgnoringTimezone(date: Date) {
  const timestamp = Date.UTC(
    date.getFullYear(),
    date.getMonth(),
    date.getDate(),
    date.getHours(),
    date.getMinutes(),
    date.getSeconds(),
    date.getMilliseconds(),
  );

  return new Date(timestamp);
}

export function convertUTCToLocalDateIgnoringTimezone(utcDate: Date) {
  return new Date(
    utcDate.getUTCFullYear(),
    utcDate.getUTCMonth(),
    utcDate.getUTCDate(),
    utcDate.getUTCHours(),
    utcDate.getUTCMinutes(),
    utcDate.getUTCSeconds(),
    utcDate.getUTCMilliseconds(),
  );
}

Dann speichere / lese ich dieses Datum wie folgt:

function saveTaskDate(localDate: Date) {
  // I convert your local calendar date so it looks like you've picked it being in UTC somewhere around London
  const utcDate = convertLocalDateToUTCIgnoringTimezone(localDate);
  api.saveTaskDate(utcDate);
}

function readTaskDate(taskUtcDate: Date) {
  // I convert this UTC date to 'look in your local timezone' as if you were now in UTC somewhere around london
  const localDateWithSameDayAsUTC = convertUTCToLocalDateIgnoringTimezone(taskUtcDate);

  // this date will have the same calendar day as the one you've picked previously
  // no matter where you were saving it and where you are now
}

4

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:

// JavaScript dates don't like hyphens!    
var rectifiedDateText = dateText.replace(/-/g, "/");
var d = new Date(rectifiedDateText);

// Using a predefined mask from date.format.js.
var convertedDate = dateFormat(d, 'isoUtcDateTime'); 

9
Dies scheint nicht die beste Antwort auf Ihre Frage zu sein. Sie sollten etwas überdenken, das Ihre Frage direkt beantwortet, oder Ihre Frage anders stellen.
Hitautodestruct

1
Ich repariere genau dieses Skript (und diese Version), weil es für IE7 und Firefox nicht ausreicht.
Barbarrosa

4

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:

$.parseDate('yy-mm-dd', '2007-01-26');

1
Nur weil etwas nicht aktualisiert wurde, heißt das nicht, dass Sie es nicht verwenden sollten. Date.js hat jahrelang so perfekt funktioniert, dass es nicht aktualisiert werden musste. Das JS-Datumsobjekt und die verwendeten Datumsformate haben sich in den letzten Jahren nicht geändert. Warum sollte das Skript, das sie bearbeitet, diese ändern? Date.JS ist absolut die beste JS Date-Bibliothek da draußen. Es gibt ein paar Probleme in Github, aber ansonsten ist es perfekt. github.com/datejs/Datejs
thugsb

3

Diese Funktion funktioniert wunderbar für mich.

function ParseDateForSave(dateValue) {
    // create a new date object
    var newDate = new Date(parseInt(dateValue.substr(6)));

    // return the UTC version of the date
    return newDate.toISOString();
}


2
var userdate = new Date("2009-1-1T8:00:00Z");
var timezone = userdate.getTimezoneOffset();
var serverdate = new Date(userdate.setMinutes(userdate.getMinutes()+parseInt(timezone)));

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 ändern


2

Das habe ich in der Vergangenheit getan:

var utcDateString = new Date(new Date().toUTCString()).toISOString();

2

Wenn Sie ein Datumsobjekt benötigen

Nur Datumszeichenfolge übergeben Datum setzt voraus, dass die Zeit um 00:00 Uhr nach Zeitzone verschoben ist:

new Date('2019-03-11')
Sun Mar 10 2019 18:00:00 GMT-0600 (Central Standard Time)

Wenn Sie aktuelle Stunden und Minuten hinzufügen, erhalten Sie das richtige Datum:

new Date('2019-03-11 ' + new Date().getHours() + ':' + new Date().getMinutes())
Mon Mar 11 2019 04:36:00 GMT-0600 (Central Standard Time)

1

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:

JJJJ-MM-TTT00: 00: 00.

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!


1

Diese Methode gibt Ihnen: 2017-08-04T11:15:00.000+04:30und Sie können die Zonenvariable ignorieren , um sie einfach abzurufen 2017-08-04T11:15:00.000.

function getLocalIsoDateTime(dtString) {
    if(dtString == "")
        return "";
    var offset = new Date().getTimezoneOffset();
    var localISOTime = (new Date(new Date(dtString) - offset * 60000 /*offset in milliseconds*/)).toISOString().slice(0,-1);
    //Next two lines can be removed if zone isn't needed.
    var absO = Math.abs(offset);
    var zone = (offset < 0 ? "+" : "-") + ("00" + Math.floor(absO / 60)).slice(-2) + ":" + ("00" + (absO % 60)).slice(-2);
    return localISOTime + zone;
}

1

Mit dem Moment-Paket können Sie einfach eine Datumszeichenfolge von UTC in ein neues Datumsobjekt konvertieren:

const moment = require('moment');
let b = new Date(moment.utc('2014-02-20 00:00:00.000000'));
let utc = b.toUTCString();
b.getTime();

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.


4
Auch wenn dies die Frage beantworten kann, gibt es keine Erklärung für Ihren Code. Bitte aktualisieren Sie Ihre Antwort, um zu erklären, was Sie tun. Vielen Dank!
Miroslav Glamuzina


0

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()


0

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.

//First i had a string called stringDateVar that i needed to convert to Date
var newDate = new Date(stringDateVar)

//output: 2019-01-07T04:00:00.000Z
//I needed it 2019-01-07T00:00:00.000Z because i had other logic that was dependent on that 

var correctDate = new Date(newDate.setUTCHours(0))

//This will output 2019-01-07T00:00:00.000Z on everything which allows scalability 

0

Garn Moment hinzufügen

import moment from 'moment';

//local Js date to UTC using moment
const utcDate = moment.utc(moment(new date()).format('YYYY-MM-DDTHH:mm:ss')).valueOf();
console.log('UTC Date', utcDate);


// UTC to local date without moment
const localDate = convertUTCDateToLocalDate(new Date(utcDate))
console.log('UTC Date', moment(localDate).format('MMM D, YYYY HH:mm'));


function convertUTCDateToLocalDate(date) {

   let newDate = new Date(date.getTime() + date.getTimezoneOffset()*60*1000);

   const offset = date.getTimezoneOffset() / 60;
   const hours = date.getHours();

   newDate.setHours(hours - offset);

   return newDate;

}


-8

Noch einfacher

myvar.setTime(myvar.getTime() + myvar.getTimezoneOffset() * 60000);

2
Dies ist unvollständig. setTimeverlässt sich darauf new Date, was Sie nicht einschließen. Bitte vervollständigen Sie die Antwort.
random_user_name

Ist dieser Mann noch am Leben? Warum nicht einmal zu uns zurückkehren, etwas erzählen oder die Antwort bearbeiten?
Hoffnungslos
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.