2017-06-06 14 views
1

Ich versuche Millisekunden in UTC Date-Objekt zu konvertieren, wie unten -konvertieren Millisekunden in UTC-Datum Objekt mit UTC-Zeitzone

var tempDate = new Date(1465171200000); 
// --> tempDate = Mon Jun 06 2016 05:30:00 **GMT+0530 (India Standard Time)** {} 

var _utcDate = new Date(tempDate.getUTCFullYear(), tempDate.getUTCMonth(), tempDate.getUTCDate(), tempDate.getUTCHours(), tempDate.getUTCMinutes(), tempDate.getUTCSeconds()); 
//--> _utcDate = Mon Jun 06 2016 00:00:00 **GMT+0530 (India Standard Time)** {} 

Zeit UTC-Zeit wird das Zurücksetzen aber Zeitzone kommt noch als GMT + 0530 (Indien Standardzeit). Gibt es einen sicheren Schuss Ansatz, um Millisekunden in UTC-Zeitzone mit UTC-Zeitzone zu konvertieren?

+0

Warum machen Sie zwei Datums Objekte? Um die UTC-Datumszeichenfolge zu erhalten, verwenden Sie 'tempDate.toUTCString()' – evolutionxbox

+0

@evolutionxbox - Tatsächlich konvertiert tempDate.toUTCString() das Datumsobjekt in eine Zeichenkette und kann keine weiteren Datumsoperationen ausführen. –

Antwort

2

Zitiert aus this answer (die ich schlage vor, Sie vollständig zu lesen):

Es gibt keine Zeitzone oder String-Format in dem Date-Objekt selbst gespeichert. Wenn verschiedene Funktionen des Date-Objekts verwendet werden, wird die lokale Zeitzone des Computers auf die interne Repräsentation angewendet.

Da die Zeitzone nicht im Date-Objekt gespeichert ist, kann sie nicht eingestellt werden.

Ich sehe zwei Möglichkeiten:

die ersten ist die Verwendung einer Bibliothek zu machen (wie oben in der Antwort vorgeschlagen). Ganz jetzt populär ist Moment.js

die zweite (reine JavaScript - wenn es sich um eine tragfähige Lösung in Ihrem Kontext ist):

Sie die „Zeit math“ in Ihrer lokalen Zeitzone.

Wenn Sie bereit sind, zu UTC zu wechseln, verwenden Sie toUTCString() Methode.

Natürlich erhalten Sie am Ende eine Zeichenfolge, da Sie die Zeitzone so lange speichern können, wie der Wert für die Datumswerte ist.

Da Sie von nun an die Datumszeit nicht mehr als Date Objekt bearbeiten können, muss dies der letzte Schritt sein.

var tempDate = new Date(1465171200000); 
// Mon Jun 06 2016 05:30:00 GMT+0530 

// Do your date time math here 
// using the Date object's methods 

var utcDateAsString = tempDate.toUTCString(); 
// Mon Jun 06 2016 00:00:00 GMT 
+0

Der integrierte Parser ist erforderlich (ab ECMAScript 2015?), Um alle verwandten * toString * - und * toUTCString * -Methoden korrekt zu analysieren, aber nur pro Implementierung. – RobG

1

Sie sagen:

Zeit UTC-Zeit wird das Zurücksetzen aber Zeitzone kommt noch als GMT + 0530 (Indien Standard Time). Gibt es einen sicheren Schuss Ansatz um Millisekunden in UTC-Zeitzone mit UTC-Zeitzone zu konvertieren?

Aber ich denke, Sie missverstehen, was vorkommt. Wenn Sie eine Nummer an den Date-Konstruktor als Pass in:

new Date(1465171200000) 

ist davon ausgegangen, es Millisekunden seit der ECMAScript Epoche sein (1970-01-01T00: 00: 00Z), so ein Date-Objekt mit diesem Wert erstellt wird als sein interner Zeitwert. Datumsobjekte sind also inhärent UTC.

Wenn Sie das in eine Zeichenfolge schreiben, wird intern eine vom Menschen lesbare Datumszeichenfolge basierend auf der Zeitzoneneinstellung des Hosts generiert. Aus diesem Grund sehen Sie ein Datum für GMT + 0530 (das ist die Zeitzoneneinstellung Ihres Hostsystems). Das Date-Objekt selbst hat keine Zeitzone, es ist immer UTC.

Wenn Sie dann UTC Werte verwenden, um ein „lokales“ Datum erstellen mit:

new Date(tempDate.getUTCFullYear(), tempDate.getUTCMonth(), ...) 

dann wird die Host-Zeitzone einer UTC Zeitwert entspricht ein „lokales“ Datum für die zugehörigen Werte zu erzeugen, verwendet. Sie haben Ihren Zeitzonen-Offset effektiv vom ursprünglichen Zeitwert abgezogen, sodass er jetzt einen anderen Zeitpunkt darstellt. Sie können genau das gleiche Ergebnis erhalten:

var d = new Date(1465171200000); 
d.setMinutes(d.getMintues() + d.getTimezoneOffset()); 

was nur ein bisschen deutlicher zeigt, was vor sich geht. Beachten Sie, dass ECMAScript-Zeitzonen-Offsets in Minuten und entgegengesetzt zu UTC sind, dh sie sind negativ (-) für Ost und positiv (+) für West. Also ein Offset von UTC + 05: 30 wird als -330 dargestellt und Sie müssen es hinzufügen, um ein Datum zu "verschieben" anstatt es zu subtrahieren.

var tempDate = new Date(1465171200000); 
 

 
var _utcDate = new Date(tempDate.getUTCFullYear(), tempDate.getUTCMonth(), tempDate.getUTCDate(), tempDate.getUTCHours(), tempDate.getUTCMinutes(), tempDate.getUTCSeconds()); 
 

 
console.log('Direct conversion to Date\ntempDate: ' + tempDate.toString()); 
 
console.log('Adjusted using UTC methods\n_utcDate: ' + _utcDate.toString()); 
 

 
tempDate.setMinutes(tempDate.getMinutes() + tempDate.getTimezoneOffset()); 
 
console.log('Adjusted using timezoneOffset\ntempDate: ' + tempDate.toString());

Allerdings kann ich nicht verstehen, warum Sie das oben genannte tun wollen. 1465171200000 stellt einen bestimmten Zeitpunkt dar (2016-06-06T00: 00: 00Z). Wenn Sie ihn für jede Client-Zeitzone anpassen, bedeutet dies, dass er für jeden Client mit einem anderen Zeitzonen-Offset einen anderen Zeitpunkt darstellt.

1

Wenn Sie eine Date aus einer Number erstellen, wird die lokale Zeitzone berücksichtigt. Aber wenn Sie wollen, um zu sehen, was ein Zeitstempel mit den Stunden nach UTC korrigiert bedeuten würde, könnten Sie einen Helfer als solche verwendet werden:

Number.prototype.toUTCDate = function() { 
    var value = new Date(this); 

    value.setHours(value.getHours() - (value.getTimezoneOffset()/60)); 

    return value; 
}; 

Die Verwendung wäre:

var date = (1465171200000).toUTCDate(); 
Verwandte Themen