Konvertieren Sie die UTC-Epoche in das lokale Datum

272

Ich habe jetzt ein bisschen damit gekämpft. Ich versuche, die Epoche in ein Datumsobjekt umzuwandeln. Die Epoche wird mir in UTC zugesandt. Wann immer Sie new Date()eine Epoche passieren , wird davon ausgegangen, dass es sich um eine lokale Epoche handelt. Ich habe versucht, ein UTC-Objekt zu erstellen und es dann setTime()an die richtige Epoche anzupassen, aber die einzige Methode, die nützlich erscheint, ist, dass toUTCString()Zeichenfolgen mir nicht helfen. Wenn ich diese Zeichenfolge an ein neues Datum übergebe, sollte sie feststellen, dass es sich um UTC handelt, dies ist jedoch nicht der Fall.

new Date( new Date().toUTCString() ).toLocaleString()

Mein nächster Versuch war, den Unterschied zwischen der aktuellen lokalen Epoche und der aktuellen UTC-Epoche zu ermitteln, aber das konnte ich auch nicht.

new Date( new Date().toUTCString() ).getTime() - new Date().getTime()

Es gibt mir nur sehr kleine Unterschiede, unter 1000, was in Millisekunden ist.

Irgendwelche Vorschläge?

Shane Reustle
quelle
11
Die Epochenzeit ist definiert als die verstrichenen Millisekunden seit dem Datum 1970 in UTC . Es gibt keine lokale Epoche! Ich bin mir nicht sicher, ob ich dein Problem verstehe.
Chetan Sastry
Möglicherweise ist die Zeitzone auf dem Computer falsch, was zu einem anderen UTC-Wert führt?
Kijin
2
Sie müssen Ihre Uhr auf UTC-Zeit einstellen, wenn Sie die UTC-Zeit sehen möchten, wenn Sie toLocaleString () verwenden. Mitternacht UTC ist 19 Uhr EST. Wenn Sie anstelle von localeString new Date (). ToString () verwenden, erhalten Sie Folgendes: 'Fri Jan 07 2011 07:00:00 GMT-0500', das den Offset enthält.
kennebec

Antworten:

462

Ich glaube, ich habe eine einfachere Lösung - setzen Sie das Anfangsdatum auf die Epoche und fügen Sie UTC-Einheiten hinzu. Angenommen, Sie haben eine UTC-Epoche in Sekunden gespeichert. Wie wäre es 1234567890. So konvertieren Sie dies in ein korrektes Datum in der lokalen Zeitzone:

var utcSeconds = 1234567890;
var d = new Date(0); // The 0 there is the key, which sets the date to the epoch
d.setUTCSeconds(utcSeconds);

d ist jetzt ein Datum (in meiner Zeitzone) eingestellt auf Fri Feb 13 2009 18:31:30 GMT-0500 (EST)

user1030503
quelle
189
FWIW, Datumsobjekte können mit Millisekunden initialisiert werden. So var d = new Date(utcSeconds * 1000)soll das gleiche Ergebnis ergibt.
Kurttheviking
54
var d = new Date(1234567890000)gibt das gleiche Ergebnis zurück
Matjaz Lipus
11
Ich dachte, vielleicht könnten andere aus ein paar Punkten Klarheit gewinnen: Das Datumsobjekt wird nicht mit einer Zeitzone "eingeprägt" gesetzt. Betrachten Sie es als nichts als eine Zahl. Diese Zahl ist die Anzahl der Millisekunden seit dem 1. Januar 1970 bis heute (jetzt auch in UTC). Wenn Sie also ein Datumsobjekt erstellen, befindet es sich wirklich in UTC hinter den Kulissen. 2. Um dieses Datum anzuzeigen, können Sie es als Gebietsschemaeinstellung (toLocaleString () oder in UTC (toUTCString ()) anzeigen. Sie müssen nichts selbst konvertieren. Konstruieren mit utc millisec, alles gut. Konstruieren mit Zeichenfolge - solange es in der lokalen Zeitzone ist.
da Bich
2
1234567890000 wird genauso behandelt wie 1234567890, auch bekannt als das Y39K-Problem ...
Hammelfleisch
1
@muttonUp, mit 1000 Multiplikationen hat es funktioniert. Aber "Y39K Problem" Google gibt kein gültiges Ergebnis. Jede URL wird hilfreich sein
P Satish Patro
236

Es ist einfach, new Date()dauert nur Millisekunden, z

new Date(1394104654000)
> Thu Mar 06 2014 06:17:34 GMT-0500 (EST)
Djechlin
quelle
6
Schön! Dies sollte wirklich als akzeptierte Antwort angesehen werden.
Nizar B.
Dieser hat bei mir nicht funktioniert, er funktioniert, wenn Sie einen Zeitstempel haben, aber mit utc epoch müssen Sie utcseconds manuell einstellen. Die Antwort zum Akzeptieren ist die richtige Antwort
sameerali
12
Dies ist eine angemessene Antwort. Das neue Datum kann Millisekunden dauern, also multiplizieren Sie es einfach mit 1000 : const d = new Date(epoch * 1000).
Vinyll
@sameerali Vielleicht hatten Sie ein anderes Problem mit Ihrem System oder Sie wurden verwirrt. Diese Antwort ist die richtige Antwort. Die Definition der Unix-Epoche: Anzahl der Sekunden, die seit dem 1. Januar um Mitternacht UTC vergangen sind . Multiplizieren Sie einfach mit 1000, um die Anzahl der verstrichenen Millisekunden zu erhalten.
Nalply
32

Und nur für die Protokolle habe ich dies mit der Moment.js- Bibliothek gemacht, die ich sowieso für die Formatierung verwendet habe.

moment.utc(1234567890000).local()
>Fri Feb 13 2009 19:01:30 GMT-0430 (VET)
Gus
quelle
1
Der Moment ist schön, aber es ist verrückt, eine 1,3-MB-Bibliothek zu verwenden, um nur eine Epoche in ein Datum umzuwandeln. Kein Wunder, dass es so viele aufgeblähte Knoten-Apps gibt.
not2qubit
20

Die Epochenzeit ist ab dem 1. Januar 1970 in Sekunden angegeben. Gibt ab dem 1. Januar 1970 Millisekundendate.getTime() zurück . Wenn Sie also einen Epochenzeitstempel haben, konvertieren Sie ihn durch Multiplizieren mit 1000 in einen Javascript-Zeitstempel.

   function epochToJsDate(ts){
        // ts = epoch timestamp
        // returns date obj
        return new Date(ts*1000);
   }

   function jsDateToEpoch(d){
        // d = javascript date obj
        // returns epoch timestamp
        return (d.getTime()-d.getMilliseconds())/1000;
   }
Logik8
quelle
Ich habe mich gefragt, was um alles in der Welt los ist. Sehr gut zu wissen, dass epochTime! == javascriptTime, wenn es um das Parsen von Daten geht. Vielen Dank!
GrayedFox
16
 function ToLocalDate (inDate) {
    var date = new Date();
    date.setTime(inDate.valueOf() - 60000 * inDate.getTimezoneOffset());
    return date;
}
chris
quelle
1
Du hast meinen Tag gerettet. TY. Ich habe gerade das Minuszeichen durch ein Pluszeichen für meinen Job ersetzt.
Ludovic Kuty
5

Um die aktuelle Epochenzeit in [ms] in eine 24-Stunden-Zeit umzuwandeln. Möglicherweise müssen Sie die Option zum Deaktivieren des 12-Stunden- Formats angeben .

$ node.exe -e "var date = new Date(Date.now()); console.log(date.toLocaleString('en-GB', { hour12:false } ));"

2/7/2018, 19:35:24

oder als JS:

var date = new Date(Date.now()); 
console.log(date.toLocaleString('en-GB', { hour12:false } ));
// 2/7/2018, 19:35:24

console.log(date.toLocaleString('en-GB', { hour:'numeric', minute:'numeric', second:'numeric', hour12:false } ));
// 19:35:24

Hinweis: Die Verwendung von en-GBhier ist nur eine (zufällige) Auswahl eines Ortes im 24-Stunden-Format, es ist nicht Ihre Zeitzone!

not2qubit
quelle
1
Dies ist der beste Weg, um irgendeine Art von Konvertierung mit der Date-Methode zu erhalten. Vielen Dank!
SeaWarrior404
Das einzige, was ich mit dem oben Gesagten nicht mag, ist, dass es das Datum in einem mehrdeutigen Format von zurückgibt d/m/yyyyoder m/d/yyyy? Der richtige (logischste) Weg, dies anzuzeigen, sollte sein : yyyy-mm-dd. Irgendwelche Abnehmer?
not2qubit
4

Die Epochenzeit (dh die Unix-Epochenzeit) ist fast immer die Anzahl der Sekunden , die seit dem 1. Januar 1970 um 00:00:00 Uhr (UTC-Zeit) abgelaufen sind, nicht die Anzahl der Millisekunden, die einige der Antworten hier impliziert haben.

https://en.wikipedia.org/wiki/Unix_time

Wenn Sie einen Zeitwert für die Unix-Epoche erhalten haben, wird dieser wahrscheinlich in Sekunden angegeben und sieht ungefähr so ​​aus 1547035195. Wenn Sie diesen Menschen in JavaScript lesbar machen möchten, müssen Sie den Wert in Millisekunden konvertieren und diesen Wert an den Date(value)Konstruktor übergeben, z.

const unixEpochTimeMS = 1547035195 * 1000;
const d = new Date(unixEpochTimeMS);
// Careful, the string output here can vary by implementation...
const strDate = d.toLocaleString();

Sie müssen den d.setUTCMilliseconds(0)Schritt in der akzeptierten Antwort nicht ausführen, da der JavaScript- Date(value)Konstruktor einen UTC- Wert in Millisekunden (keine Ortszeit) annimmt.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date#Syntax

Beachten Sie auch, dass Sie die Verwendung des Date(...)Konstruktors vermeiden sollten, der eine Datums- / Uhrzeitdarstellung für Zeichenfolgen verwendet. Dies wird nicht empfohlen (siehe den obigen Link).

garryp
quelle
3

Möchten Sie nur eine UTC-Zeichenfolge in eine "lokale" Zeichenfolge konvertieren? Du könntest es tun:

var utc_string = '2011-09-05 20:05:15';
var local_string = (function(dtstr) {
    var t0 = new Date(dtstr);
    var t1 = Date.parse(t0.toUTCString().replace('GMT', ''));
    var t2 = (2 * t0) - t1;
    return new Date(t2).toString();
})(utc_string);
ZagNut
quelle
3

Ergänzung zur obigen Antwort von @djechlin

d = '1394104654000';
new Date(parseInt(d));

konvertiert die EPOCH-Zeit in ein vom Menschen lesbares Datum. Vergessen Sie nur nicht, dass diese Art von EPOCH-Zeit eine Ganzzahl sein muss.

Sarvar Nishonboev
quelle
3

Die einfachste Lösung, die ich dafür gefunden habe, ist:

var timestamp = Date.now(), // returns milliseconds since epoch time
    normalisedTime = new Date(timestamp);

Beachten Sie, dass dies nicht * 1000am Ende der new Date(timestamp)Aussage steht, da dies (für mich jedenfalls!) Immer das falsche Datum anzugeben scheint, dh anstatt das Jahr 2019 als 51015 anzugeben, denken Sie daran.

Rob P.
quelle
2

Wenn Sie Zeitstempel und Datumskonvertierungen von und nach UTC und Ortszeit ohne Bibliotheken wie moment.js auflösen möchten, sehen Sie sich die folgende Option an.

Bei Anwendungen, die UTC-Zeitstempel verwenden, müssen Sie möglicherweise das Datum im Browser anzeigen, wobei die lokale Zeitzone und gegebenenfalls die Sommerzeit zu berücksichtigen sind. Das Bearbeiten eines Datums, das sich in einer anderen Sommerzeit befindet, obwohl es sich in derselben Zeitzone befindet, kann schwierig sein.

Mit den folgenden Numberund DateErweiterungen können Sie Datumsangaben in der Zeitzone der Zeitstempel anzeigen und abrufen. Angenommen, Sie befinden sich in Vancouver. Wenn Sie ein Datum im Juli oder Dezember bearbeiten, kann dies bedeuten, dass Sie ein Datum in PST oder PDT bearbeiten.

Ich empfehle Ihnen, das Code-Snippet unten zu überprüfen, um diese Lösung zu testen.

Umrechnungen aus Millisekunden

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

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

    return value;
};

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

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

    return value;
};

Umrechnungen von Daten

Date.prototype.getUTCTime = function () {
    return this.getTime() - (this.getTimezoneOffset() * 60000);
};

Verwendung

// Adds the timezone and daylight savings if applicable
(1499670000000).toLocalDate();

// Eliminates the timezone and daylight savings if applicable
new Date(2017, 6, 10).getUTCTime();

Überzeugen Sie sich selbst

Darlesson
quelle
Dies ist die eigentliche Antwort. Arbeitete wie ein Zauber für mich. Das Festlegen eines neuen Datums (0) und das Hinzufügen von Millisekunden entspricht dem neuen Datum (Millisekunden)
Jersey_Guy
1

BEARBEITEN

var utcDate = new Date(incomingUTCepoch);
var date = new Date();
date.setUTCDate(utcDate.getDate());
date.setUTCHours(utcDate.getHours());
date.setUTCMonth(utcDate.getMonth());
date.setUTCMinutes(utcDate.getMinutes());
date.setUTCSeconds(utcDate.getSeconds());
date.setUTCMilliseconds(utcDate.getMilliseconds());

BEARBEITEN behoben

Amjad Masad
quelle
Ich habe dies in meinem zweiten Beispiel durchgearbeitet. Die Unterschiede, die es mir gibt, liegen irgendwo zwischen 50 und 900, was in Millisekunden ist (zeigt die Zeit während der Verarbeitung der Berechnung, nicht den tatsächlichen Unterschied)
Shane Reustle
Keiner von ihnen hilft mir. Ihnen fehlt eine setUTCTime-Methode, die perfekt wäre: P w3schools.com/jsref/jsref_obj_date.asp
Shane Reustle
Funktioniert nicht, zumindest unter Firefox für Ubuntu. Der Code sollte nicht Tag / Monat / Jahr nach dem Datum festlegen.
Simon Kozlov
@ Simon Kozlov Eigentlich ist das eine falsche Annahme im Datumsobjekt, setDate und getDate beziehen sich auf den Tag im Monat, und das Problem ist, dass ich Funktionen wie (setUTCDay) verwendet habe, die nicht existieren, überrascht, dass sie akzeptiert wurden !!
Amjad Masad
@AmjadMasad Ihre Antwort wäre hilfreicher, wenn Sie auch die erwartete Ausgabe anzeigen würden.
not2qubit
0

In Anbetracht dessen haben Sie zur epoch_timeVerfügung,

// for eg. epoch_time = 1487086694.213
var date = new Date(epoch_time * 1000); // multiply by 1000 for milliseconds
var date_string = date.toLocaleString('en-GB');  // 24 hour format
apurva.nandan
quelle
0

@ Amjad, gute Idee, aber eine bessere Implementierung wäre:

Date.prototype.setUTCTime = function(UTCTimestamp) {
    var UTCDate = new Date(UTCTimestamp);
    this.setUTCFullYear(UTCDate.getFullYear(), UTCDate.getMonth(), UTCDate.getDate());
    this.setUTCHours(UTCDate.getHours(), UTCDate.getMinutes(), UTCDate.getSeconds(), UTCDate.getMilliseconds());
    return this.getTime();
}
Walf
quelle
-1

Konvertieren Sie es zuerst in String und ersetzen Sie dann den Zeitzonentext.

function convertUnixTime(time) {
  return new Date(time*1000).toString().replace("GMT+0530 (Sri Lanka Standard Time)","");
}
Roboterjunge
quelle