it-swarm.com.de

Konvertieren Sie UTC-Epoche in lokales Datum

Ich habe jetzt seit einiger Zeit damit zu kämpfen. Ich versuche, Epoch in ein Datumsobjekt zu konvertieren. Die Epoche wird in UTC an mich gesendet. Immer wenn Sie new Date() eine Epoche übergeben, wird davon ausgegangen, dass es sich um die lokale Epoche handelt. Ich habe versucht, ein UTC-Objekt zu erstellen und es mit setTime() an die richtige Epoche anzupassen. Die einzige Methode, die als nützlich erscheint, ist toUTCString(). Wenn ich die Zeichenfolge an ein neues Datum übergeben, sollte dies als UTC-Zeit angegeben werden. Dies geschieht jedoch nicht.

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

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

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

Es gibt nur sehr kleine Unterschiede, unter 1000, die in Millisekunden liegen.

Irgendwelche Vorschläge?

219
Shane Reustle

Ich denke, ich habe eine einfachere Lösung - setzen Sie das Anfangsdatum auf Epoche und fügen Sie UTC-Einheiten hinzu. Angenommen, Sie haben eine UTC-Epoch-Variable in Sekunden gespeichert. Wie wäre es mit 1234567890. So konvertieren Sie das 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), das auf Fri Feb 13 2009 18:31:30 GMT-0500 (EST) gesetzt ist.

395
user1030503

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

new Date(1394104654000)
> Thu Mar 06 2014 06:17:34 GMT-0500 (EST)
150
djechlin

Und nur für die Protokolle habe ich dies mit Moment.js library gemacht, die ich sowieso zum Formatieren verwendet habe.

moment.utc(1234567890000).local()
>Fri Feb 13 2009 19:01:30 GMT-0430 (VET)
29
Gus
 function ToLocalDate (inDate) {
    var date = new Date();
    date.setTime(inDate.valueOf() - 60000 * inDate.getTimezoneOffset());
    return date;
}
16
chris

Die Epochenzeit ist in Sekunden vom 1. Januar 1970. date.getTime() gibt Millisekunden vom 1. Januar 1970 zurück. Wenn Sie 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;
   }
15
logic8

Wollen 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);
3
ZagNut

Um die aktuelle Epoche in [ms] in eine 24-Stunden-Zeit umzuwandeln. Möglicherweise müssen Sie die Option auf 12-Stunden deaktivieren formatieren.

$ 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-GB hier ist nur eine (zufällige) Auswahl eines Ortes im 24-Stunden-Format, es ist nicht Ihre Zeitzone!

2
not2qubit

Ergänzung der obigen Antwort durch @djechlin

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

konvertiert die Epoche in ein vom Menschen lesbares Datum. Vergessen Sie nicht, dass die Epoche eine Ganzzahl sein muss. 

1

Wenn Sie Zeitstempel und Datumsumwandlungen von und nach UTC und Ortszeit ohne Bibliotheken wie moment.js auflösen möchten, lesen Sie die unten stehende Option.

Bei Anwendungen, die UTC-Zeitstempel verwenden, müssen Sie möglicherweise das Datum im Browser unter Berücksichtigung der lokalen Zeitzone und der Sommerzeit einblenden. Das Bearbeiten eines Datums mit einer anderen Sommerzeit, obwohl in derselben Zeitzone, kann schwierig sein.

Mit den folgenden Erweiterungen Number und Date 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.

Konvertierungen in 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;
};

Konvertierungen von Datumsangaben

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

Verwendungszweck

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

// Extending Number

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;
};

// Extending Date

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

// Getting the demo to work
document.getElementById('m-to-local-button').addEventListener('click', function () {
  var displayElement = document.getElementById('m-to-local-display'),
      value = document.getElementById('m-to-local').value,
      milliseconds = parseInt(value);
  
  if (typeof milliseconds === 'number')
    displayElement.innerText = (milliseconds).toLocalDate().toISOString();
  else
    displayElement.innerText = 'Set a value';
}, false);

document.getElementById('m-to-utc-button').addEventListener('click', function () {
  var displayElement = document.getElementById('m-to-utc-display'),
      value = document.getElementById('m-to-utc').value,
      milliseconds = parseInt(value);
  
  if (typeof milliseconds === 'number')
    displayElement.innerText = (milliseconds).toUTCDate().toISOString();
  else
    displayElement.innerText = 'Set a value';
}, false);

document.getElementById('date-to-utc-button').addEventListener('click', function () {
  var displayElement = document.getElementById('date-to-utc-display'),
      yearValue = document.getElementById('date-to-utc-year').value || '1970',
      monthValue = document.getElementById('date-to-utc-month').value || '0',
      dayValue = document.getElementById('date-to-utc-day').value || '1',
      hourValue = document.getElementById('date-to-utc-hour').value || '0',
      minuteValue = document.getElementById('date-to-utc-minute').value || '0',
      secondValue = document.getElementById('date-to-utc-second').value || '0',
      year = parseInt(yearValue),
      month = parseInt(monthValue),
      day = parseInt(dayValue),
      hour = parseInt(hourValue),
      minute = parseInt(minuteValue),
      second = parseInt(secondValue);
  
  displayElement.innerText = new Date(year, month, day, hour, minute, second).getUTCTime();
}, false);
<link href="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.2.11/semantic.css" rel="stylesheet"/>

<div class="ui container">
  <p></p>
  
  <h3>Milliseconds to local date</h3>
  <input id="m-to-local" placeholder="Timestamp" value="0" /> <button id="m-to-local-button">Convert</button>
  <em id="m-to-local-display">Set a value</em>

  <h3>Milliseconds to UTC date</h3>
  <input id="m-to-utc" placeholder="Timestamp" value="0" /> <button id="m-to-utc-button">Convert</button>
  <em id="m-to-utc-display">Set a value</em>
  
  <h3>Date to milliseconds in UTC</h3>
  <input id="date-to-utc-year" placeholder="Year" style="width: 4em;" />
  <input id="date-to-utc-month" placeholder="Month" style="width: 4em;" />
  <input id="date-to-utc-day" placeholder="Day" style="width: 4em;" />
  <input id="date-to-utc-hour" placeholder="Hour" style="width: 4em;" />
  <input id="date-to-utc-minute" placeholder="Minute" style="width: 4em;" />
  <input id="date-to-utc-second" placeholder="Second" style="width: 4em;" />
  <button id="date-to-utc-button">Convert</button>
  <em id="date-to-utc-display">Set the values</em>
  
</div>

1
Darlesson

EDIT

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

EDITbehoben

1
Amjad Masad

@ Amjad, gute Idee, aber schlecht umgesetzt. Versuchen

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();
}
0
Walf

Sie haben Epoch_time zur Verfü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
0
apurva.nandan

Die einfachste Lösung, die ich dazu gefunden habe, ist:

var timestamp = Date.Now()    
var normalisedTime = new Date(timestamp)

Beachten Sie, dass dies nicht den * 1000 am Ende der new Date(timestamp)-Anweisung hat, da diese (für mich sowieso!) Immer ein falsches Datum auszusprechen scheint, dh anstelle des Jahres 2019 gibt es das Jahr als 51015 an Verstand.

0
Rob P

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

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

Wenn Sie einen Zeitwert für die Unix-Epoche angegeben haben, wird dieser wahrscheinlich in Sekunden angegeben und sieht etwa wie 1547035195 aus. Wenn Sie diesen in JavaScript lesbar machen möchten, müssen Sie den Wert in Millisekunden konvertieren und diesen Wert in den Date(value)-Konstruktor übergeben, z. B .:

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 Schritt d.setUTCMilliseconds(0) in der akzeptierten Antwort nicht ausführen, da der JavaScript-Konstruktor Date(value) einen UTC -Wert in Millisekunden (keine Ortszeit) benötigt.

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

Beachten Sie auch, dass Sie den Date(...)-Konstruktor vermeiden sollten, der eine String-Datetime-Darstellung verwendet. Dies wird nicht empfohlen (siehe den Link oben).

0
garryp