wake-up-neo.com

Wie konvertiert man ein JavaScript-Datum in UTC?

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 Datums- und Zeitangaben in UTC sind. 

Angenommen, der Benutzer befindet sich in Alaska, Hawaii oder Fidschi. Da sie sich in einer Zeitzone befinden, die sich stark von UTC unterscheidet, muss der Datumsbereich wie folgt konvertiert werden:

2009-1-1T8:00:00 to 2009-1-4T7:59:59

Wie würden Sie mit dem JavaScript-Date-Objekt den ersten "lokalisierten" Datumsbereich in etwas konvertieren, das der Server versteht?

469
dthrasher

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

Quelle: MDN-Webdokumente

Das von Ihnen benötigte Format wird mit der .toISOString()-Methode erstellt. Bei älteren Browsern (ie8 und unter), die diese Methode nicht nativ unterstützen, finden Sie das Shim hier

Dies gibt Ihnen die Möglichkeit, das zu tun, was Sie brauchen:

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

Für die Timezone-Arbeit sind moment.js und moment.js timezone wirklich unschätzbare Werkzeuge ... vor allem für die Navigation in Zeitzonen zwischen Client- und Server-Javascript.

306
Will Stern

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);
497
DrunkCoder

Hier ist meine Methode:

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

Das resultierende utc-Objekt ist kein UTC-Datum, sondern ein lokales Datum, das der UTC-Zeit entspricht (siehe Kommentare). In der Praxis erledigt es jedoch die Arbeit.

157
Gras Double
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(':');    
}
24
kennebec

In ISO konvertieren, ohne Datum und 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

In ISO umwandeln mit Änderung von Datum/Uhrzeit (Datum/Uhrzeit werden geändert)

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

Fiddle link

20
RollerCosta

Browser können sich unterscheiden, 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 ein JavaScript-Datumsobjekt für das aktuelle Datum und die aktuelle Uhrzeit gemäß den Systemeinstellungen.
  • 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 new Date ( Date.UTC (...) ) mit denselben Argumenten. (Anmerkung: Date.UTC () gibt die Anzahl der Millisekunden seit 1970-01-01 00:00:00 UTC zurück.)

Das Hinzufügen von 60000 * Date.getTimezoneOffset (), wie in früheren 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 mit dieser Nummer ein neues Datum erstellen, wie oben beschrieben, 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, an dem Sie es aufgerufen haben (ich kann dies jedoch nicht als Standard bestätigen).

Wenn ich in meinem Browser 60000 * Date.getTimezoneOffset () hinzufüge, wird eine DateTime erstellt, die und nicht UTC ist. Bei der Anzeige in meinem Browser (z. B. .toString ()) wird jedoch eine DateTime in meiner lokalen Zeitzone angezeigt, die die richtige UTC-Zeit wäre, wenn die Zeitzoneninformationen ignoriert würden.

18
Aaron Hoffman
var myDate = new Date(); // Set this to your date in whichever timezone.
var utcDate = myDate.toUTCString();
12
James Skidmore

Versuchen Sie, das Datum in eine solche Zeichenfolge umzuwandeln?

Ich würde eine Funktion dazu erstellen, die, wenn auch etwas kontrovers, dem Date-Prototyp hinzugefügt wird. Wenn Sie damit nicht vertraut sind, können Sie es als Standalone-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 dies in UTC-Zeit benötigen, ersetzen Sie einfach alle get * -Funktionen durch getUTC *, z.

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

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

7
jcomeau_ictx

Wenn Sie mit Datumsangaben arbeiten, empfehle ich, das Datum aus der Benutzereingabe in einzelne Felder zu parsen. Sie können es als vollständige 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

Tun Sie niemals etwas wie:

new Date('date as text');

Wenn Sie Ihr Datum in die einzelnen Felder aus der Benutzereingabe analysiert haben, erstellen Sie ein Datumsobjekt. 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);

Nun können Sie das Datum in UTC-Zeit an den Server übergeben. Ich würde wieder empfehlen, keine Datumsangaben zu verwenden. Übergeben Sie es entweder an den Server, bis zur niedrigsten Granularität, die Sie benötigen, z. Jahr, Monat, Tag, Minute oder als Wert wie Millisekunden aus der Unix-Epoche.

7

Wenn Sie viel mit Daten zu tun haben, lohnt es sich, moment.js ( http://momentjs.com ) zu verwenden. Die in UTC zu konvertierende Methode wäre:

moment(yourTime).utc()

Sie können format verwenden, um Ihr Datum in jedes gewünschte Format zu ändern:

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

Es gibt auch Offset-Optionen im Moment, aber es gibt eine zusätzliche Bibliothek zum Umgang mit Zeitzonen ( http://momentjs.com/timezone/ ). Die Zeitumstellung wäre so einfach:

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

Eine andere Lösung, die in UTC konvertiert und als Datumsobjekt beibehalten werden soll: (Dies geschieht, indem der GMT-Teil vom Ende der formatierten Zeichenfolge entfernt und dann wieder in den Date-Konstruktor eingefügt wird.)

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

Ich musste dies tun, um mit einer datetime-Auswahlbibliothek zu kommunizieren. Im Allgemeinen ist es jedoch eine schlechte Idee, auf diese Weise mit Datumsangaben zu arbeiten.

Benutzer möchten im Allgemeinen mit Datumszeiten in ihrer Ortszeit arbeiten. Sie müssen also entweder den serverseitigen Code aktualisieren, um Datumszeilenzeichenfolgen korrekt mit Offsets zu analysieren, dann in UTC (beste Option) konvertieren oder in eine UTC-Zeichenfolge auf der Clientseite konvertieren, bevor Sie sie an das senden Server (wie in Will Sterns Antwort)

5
CMcClymont

Ich habe festgestellt, dass das jQuery Globalization Plugin Date-Parsing am besten funktioniert. Andere Methoden hatten Cross-Browser-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 ähnlich dem in den Dokumenten angegebenen Beispiel aufrufen:

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

Ich habe gerade entdeckt, dass die Version 1.2.3 von Steven Levithans date.format.js genau das macht, was ich will. Sie können eine Formatzeichenfolge für ein JavaScript-Datum angeben und die Ortszeit in UTC umrechnen. 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'); 
4
dthrasher

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();
}
3
Will Strohl
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 Uhrzeit.
Dies ist darauf zurückzuführen, dass getTimezoneOffset() Ihnen die Zeitzonenunterschiede in Minuten angibt Ich empfehle Ihnen, toISOString() nicht zu verwenden, da die Ausgabe in der Zeichenfolge erfolgt. Daher können Sie das Datum in Zukunft nicht ändern

1
Sanket Patel

Wenn Sie Ihre Frage betrachten, ist es klar, dass Sie den Datumsbereich nur zur weiteren Bearbeitung an Ihr Backend senden möchten.

Ich gehe davon aus, dass Sie die Standarddatenrichtlinien einhalten, die davon ausgehen, dass die Daten ein bestimmtes Format haben. Zum Beispiel verwende ich ODATA, eine RESTfull-API, die erwartet, dass Datumszeitobjekte im folgenden Format vorliegen:

JJJJ-MM-DDT00: 00: 00.

Dies kann leicht über den unten angegebenen Snippet erreicht werden (Bitte ändern Sie das Format entsprechend Ihrer Anforderung). 

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 das Datum in Ihr lokales Datum konvertiert. Sie sind dagegen am UTC-Datum interessiert, dann 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 hinzugefügte/subtrahierte Zeit basierend auf der Zeitzone. 

Wenn ich zum Beispiel in EST (GMT-5) bin und mein Service ein Datum und eine Uhrzeit zurückgibt, wird das Datum zurückgegeben Zeit. Wenn ich also versuche, die Uhrzeit abzurufen, bekomme ich Mi Aug 16 2016 19:00:00 GMT-0500. Dies verursacht viele Probleme. Es gibt viele Bibliotheken, die dies definitiv erleichtern werden, 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-und-utc-to-local-date/ wo In bekam ich meine Inspiration.

Hoffe das hilft!

1
Reeth

Das habe ich in der Vergangenheit gemacht:

var utcDateString = new Date(new Date().toUTCString()).toISOString();
1
Pradyumna Das

Diese Methode gibt Ihnen Folgendes: 2017-08-04T11:15:00.000+04:30 und Sie können zone variable ignorieren, um einfach 2017-08-04T11:15:00.000 zu erhalten.

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

UTC-Methode moment.js verwenden ;

const moment = require('moment');
const utc = moment.utc(new Date(string));
1
Yaki Klein

Mit dem moment-Paket können Sie ganz einfach eine Datumszeichenfolge von UTC in ein neues Date-Objekt 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 keine Zeitzone unterstützt und Sie das UTC-Datum immer auf dem Server speichern und es 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. Teilen Sie hier, damit es anderen helfen kann. Ich sehe in keiner Antwort genau die obige Lösung. Vielen Dank.

0
Bimal Jha

Ich weiß, dass diese Frage alt ist, aber das gleiche Problem betrachtet wurde, und eine Option wäre stattdessen date.valueOf () an den Server zu senden. Die Funktion valueOf () des Javascript-Datums sendet die Anzahl der Millisekunden seit Mitternacht, 1. Januar 1970, UTC.

Wert von()

0
weagle08

Wenn Sie ein Datumsobjekt benötigen

Nur Datumszeichenfolge übergeben Date setzt voraus, dass die Uhrzeit um 00:00 Uhr verschoben wird:

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

Wenn Sie die aktuellen Stunden und Minuten hinzufügen, erhalten Sie das korrekte Datum:

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

So musste ich es machen, weil ich immer noch wollte, dass ein JavaScript-Datumsobjekt als Datum manipuliert wird, und unglücklicherweise erfordern viele dieser Antworten, dass Sie zu einer Zeichenfolge wechseln.

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