it-swarm.com.de

Wie bekomme ich einen UTC-Zeitstempel in JavaScript?

Beim Schreiben einer Webanwendung ist es sinnvoll, (serverseitige) alle dat-Zeiten in der DB als UTC-Zeitstempel zu speichern.

Ich war erstaunt, als ich bemerkte, dass Sie bei der Timezone-Manipulation in JavaScript nativ nichts tun konnten.

Ich habe das Date-Objekt etwas erweitert. Ist diese Funktion sinnvoll? Grundsätzlich wird jedes Mal, wenn ich etwas an den Server schicke, ein mit dieser Funktion formatierter Zeitstempel verwendet ...

Können Sie hier größere Probleme sehen? Oder vielleicht eine Lösung aus einem anderen Blickwinkel?

Date.prototype.getUTCTime = function(){ 
  return new Date(
    this.getUTCFullYear(),
    this.getUTCMonth(),
    this.getUTCDate(),
    this.getUTCHours(),
    this.getUTCMinutes(), 
    this.getUTCSeconds()
  ).getTime(); 
}

Es scheint mir nur ein wenig verworren zu sein. Und ich bin auch nicht so sicher in Bezug auf die Leistung.

131
Merc
  1. Auf diese Weise konstruierte Datumsangaben verwenden die lokale Zeitzone, wodurch das erstellte Datum falsch ist. Um die Zeitzone eines bestimmten Datumsobjekts festzulegen, erstellen Sie es aus einer Datumszeichenfolge, die die Zeitzone enthält. (Ich hatte Probleme damit, dies in einem älteren Android-Browser zu erreichen.)

  2. Beachten Sie, dass getTime() Millisekunden und keine einfachen Sekunden zurückgibt.

Für einen UTC/Unix-Zeitstempel sollte Folgendes ausreichen:

Math.floor((new Date()).getTime() / 1000)

Der aktuelle Zeitzonenversatz wird in das Ergebnis einbezogen. Für eine Zeichenfolgendarstellung funktioniert David Ellis ' answer.

Zu klären:

new Date(Y, M, D, h, m, s)

Diese Eingabe wird als local time behandelt. Wenn die UTC-Zeit übergeben wird, unterscheiden sich die Ergebnisse. Beachten Sie (ich bin jetzt in GMT +02: 00 und es ist 07:50 Uhr):

> var d1 = new Date();
> d1.toUTCString();
"Sun, 18 Mar 2012 05:50:34 GMT" // two hours less than my local time
> Math.floor(d1.getTime()/ 1000)
1332049834 

> var d2 = new Date( d1.getUTCFullYear(), d1.getUTCMonth(), d1.getUTCDate(), d1.getUTCHours(), d1.getUTCMinutes(), d1.getUTCSeconds() );
> d2.toUTCString();
"Sun, 18 Mar 2012 03:50:34 GMT" // four hours less than my local time, and two hours less than the original time - because my GMT+2 input was interpreted as GMT+0!
> Math.floor(d2.getTime()/ 1000)
1332042634

Beachten Sie auch, dass getUTCDate() nicht durch getUTCDay() ersetzt werden kann. Dies liegt daran, dass getUTCDate()der Tag des Monats zurückgibt. _; getUTCDay() gibt dagegen den Wochentag zurück.

128
DCoder

Sie können es auch mit getTimezoneOffset und getTime tun,

x = new Date()
var UTCseconds = (x.getTime() + x.getTimezoneOffset()*60*1000)/1000;

console.log("UTCseconds", UTCseconds)

47
Shiplu Mokaddim

Ja, Sie müssen nicht so viel tun. vorausgesetzt ich verstehe dich richtig, du willst nur die toUTCString Methode .

var UTCstring = (new Date()).toUTCString();

console.log('UTCstring', UTCstring);
  

Denken Sie jedoch daran, dass die Datumswerte, die Sie erhalten, auf der Uhr des Clientcomputers und nicht auf Ihrem Server basieren. Wenn Sie für diese Daten genaue Werte benötigen (z. B. um zu bestimmen, wann diese oder jene Aktion im Verhältnis zur Aktion eines anderen Benutzers durchgeführt wurde), können Sie nicht sich sowieso auf die clientseitige Datumsbibliothek verlassen, und Sie müssen die Daten serverseitig basierend darauf berechnen, wann der Client Sie kontaktiert hat.

Denken Sie auch daran, dass grundsätzlich der gesamte clientseitige Code vom Client geändert und schädliche Werte zurückgegeben werden können. Stattdessen können Sie nur den Code auf dem Server garantieren. Behandeln Sie den clientseitigen Code wie einen möglichen Angreifer.

42
David Ellis

Auf der Clientseite müssen Sie in der Regel nicht viel "Timezone-Manipulation" vornehmen. In der Regel versuche ich, UTC-Daten in Form von ticks oder " Anzahl der Millisekunden seit Mitternacht des 1. Januar 1970 " zu speichern und damit zu arbeiten. Dies vereinfacht die Speicherung, Sortierung und Berechnung von Offsets und behebt vor allem die Kopfschmerzen der Anpassungen bei "Sommerzeit". Hier ist ein kleiner JavaScript-Code, den ich benutze.

So erhalten Sie die aktuelle UTC-Zeit:

function getCurrentTimeUTC()
{
    //RETURN:
    //      = number of milliseconds between current UTC time and midnight of January 1, 1970
    var tmLoc = new Date();
    //The offset is in minutes -- convert it to ms
    return tmLoc.getTime() + tmLoc.getTimezoneOffset() * 60000;
}

In der Regel müssen Sie Datum und Uhrzeit für den Endbenutzer für seine local - Zeitzone und sein Format formatieren. Das Folgende kümmert sich um die Komplexität der Datums- und Zeitformate auf dem Clientcomputer:

function formatDateTimeFromTicks(nTicks)
{
    //'nTicks' = number of milliseconds since midnight of January 1, 1970
    //RETURN:
    //      = Formatted date/time
    return new Date(nTicks).toLocaleString();
}

function formatDateFromTicks(nTicks)
{
    //'nTicks' = number of milliseconds since midnight of January 1, 1970
    //RETURN:
    //      = Formatted date
    return new Date(nTicks).toLocaleDateString();
}

function formatTimeFromTicks(nTicks)
{
    //'nTicks' = number of milliseconds since midnight of January 1, 1970
    //RETURN:
    //      = Formatted time
    return new Date(nTicks).toLocaleTimeString();
}

Also folgendes Beispiel:

var ticks = getCurrentTimeUTC();  //Or get it from the server

var __s = "ticks=" + ticks + 
    ", DateTime=" + formatDateTimeFromTicks(ticks) +
    ", Date=" + formatDateFromTicks(ticks) +
    ", Time=" + formatTimeFromTicks(ticks);

document.write("<span>" + __s + "</span>");

Gibt Folgendes zurück (für mein US-amerikanisches Gebietsschema):

ticks = 1409103400661, DateTime = 8/26/2014 18:36:40 PM, Datum = 8/26/2014, Zeit = 6: 36: 40 Uhr

13
ahmd0

Ich denke eigentlich, dass Datumswerte in js weitaus besser sind als die C # DateTime-Objekte. Die C # -DateTime-Objekte verfügen über eine Kind-Eigenschaft, jedoch keine strikte zugrunde liegende Zeitzone als solche, und Zeitzonenkonvertierungen sind schwer zu verfolgen, wenn Sie zwischen zwei Nicht-UTC- und Nicht-Ortszeiten konvertieren. In js haben alle Date-Werte einen zugrunde liegenden UTC-Wert, der rundherum weitergegeben wird und unabhängig von den von Ihnen vorgenommenen Offerten- oder Zeitzonen-Konvertierungen bekannt ist. Meine größte Beschwerde bezüglich des Date-Objekts ist die Menge undefiniertes Verhalten, das Browser-Implementierer ausgewählt haben. Dies kann Personen verwechseln, die Datumsangaben in js mit Versuch und Irrtum angreifen, anstatt die Spezifikation zu lesen. Die Verwendung von iso8601.js löst dieses unterschiedliche Verhalten, indem eine einzelne Implementierung des Date-Objekts definiert wird.

Die Spezifikation besagt standardmäßig, dass Sie Datumsangaben mit einem erweiterten ISO 8601-Datumsformat erstellen können, z

var someDate = new Date('2010-12-12T12:00Z');

So können Sie auf diese Weise auf die genaue UTC-Zeit schließen. 

Wenn Sie den Datumswert an den Server zurückgeben möchten, den Sie anrufen würden

someDate.toISOString();

oder wenn Sie lieber mit einem Millisekunden-Zeitstempel arbeiten möchten (Anzahl Millisekunden ab dem 1. Januar 1970 UTC)

someDate.getTime();

ISO 8601 ist ein Standard. Sie können nicht verwirrt sein, was eine Datumszeichenfolge bedeutet, wenn Sie den Datumsversatz angeben. Für Sie als Entwickler bedeutet dies, dass Sie Sie müssen sich niemals mit Ortszeitkonvertierungen befassen. Die Ortszeitwerte dienen ausschließlich dem Benutzer und Datumswerte werden standardmäßig in ihrer Ortszeit angezeigt. Bei allen lokalen Zeitmanipulationen können Sie für den Benutzer Sinnvolles anzeigen und Zeichenfolgen aus Benutzereingaben konvertieren. Es ist empfehlenswert, so schnell wie möglich in UTC zu konvertieren, und das js Date-Objekt macht dies ziemlich trivial.

Nachteil ist, dass für den Client (der mir bekannt ist) nicht viel Zeit zum Erzwingen der Zeitzone oder des Gebietsschemas geboten wird, was für website-spezifische Einstellungen ärgerlich sein kann. Ich denke jedoch, dass dies ein Benutzer ist Konfiguration, die nicht berührt werden sollte.

Kurz gesagt, der Grund, warum es nicht viel native Unterstützung für die Zeitzonenmanipulation gibt, ist, dass Sie es einfach nicht tun wollen.

11
Matt Esch

Der einfachste Weg, um UTC-Zeit in einem herkömmlichen Format zu erhalten, ist wie folgt:

new Date().toISOString()
"2016-06-03T23:15:33.008Z"
10
Tahsin Turkoz

Ich denke, das ist eine bessere Lösung

// UTC milliseconds
new Date(Date.now()+(new Date().getTimezoneOffset()*60000)).getTime()

// UTC seconds
new Date(Date.now()+(new Date().getTimezoneOffset()*60000)).getTime()/1000|0
4
koalex

Ich benutze folgendes:

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

Nachdem Sie diese Methode definiert haben, können Sie Folgendes tun:

var utcTime = new Date().getUTCTime();
4
jlbofh

Wenn Sie einen one Liner möchten, kann der UTC Unix-Zeitstempel in JavaScript erstellt werden als:

var currentUnixTimestap = ~~(+new Date() / 1000);

Hierbei wird die Zeitzone des Systems berücksichtigt. Grundsätzlich ist die Zeit in Sekunden seit Epoche vergangen.

Wie es funktioniert:

  • Erstellen Sie ein Datumsobjekt: new Date().
  • Konvertieren Sie in Zeitstempel, indem Sie unary + vor der Objekterstellung hinzufügen, um es in timestamp integer zu konvertieren. : +new Date().
  • Millisekunden in Sekunden umrechnen: +new Date() / 1000
  • Verwenden Sie double tildes , um den Wert auf eine ganze Zahl abzurunden. : ~~(+new Date())
3
Kushal Likhi

Da new Date().toUTCString() eine Zeichenfolge wie "Wed, 11 Oct 2017 09:24:41 GMT" zurückgibt, können Sie die letzten 3 Zeichen in Scheiben schneiden und die aufgeschnittene Zeichenfolge an new Date() übergeben:

new Date()
// Wed Oct 11 2017 11:34:33 GMT+0200 (CEST)

new Date(new Date().toUTCString().slice(0, -3))
// Wed Oct 11 2017 09:34:33 GMT+0200 (CEST)
2
Maurice

BEARBEITEN: Der folgende Code funktioniert NICHT. Ich ging immer davon aus, dass das neue Datum (). GetTime () die Anzahl der Sekunden seit dem 1. Januar 1970 in der aktuellen Zeitzone zurückgibt. Dies ist nicht der Fall: getTime () gibt die Anzahl der Sekunden in UTC zurück. Der nachstehende Code führt also zu einer übermäßigen Anpassung. Dank euch allen!]

Zunächst einmal danke ich Ihnen für Ihre fantastischen Einblicke ... Ich denke, meine Frage hatte den falschen Titel ... es hätte eigentlich "UTC Unix Timestamp für ein bestehendes Datum" sein sollen.

Also, wenn ich ein Datumsobjekt habe:

var d = new Date(2009,01,31)

Ich war auf der Suche nach einer Funktion, die mir sagen würde "The UTC Unix Timestamp".

Diese Funktion scheint der wahre Trick zu sein:

Date.prototype.getUTCUnixTime =  function (){
  return Math.floor( new Date(
    this.getUTCFullYear(),
    this.getUTCMonth(),
    this.getUTCDate(),
    this.getUTCHours(),
    this.getUTCMinutes(), 
    this.getUTCSeconds()
  ).getTime() / 1000); 
}

Beachten Sie, dass es an "diesem" funktioniert. Dies bedeutet, dass ich Folgendes tun kann:

var n = new Date(2008,10,10)
...
...

n.getUTCUnixTime();

Und erhalte die Anzahl der Sekunden seit dem 1. Januar 1970 in Unix-Zeit.

Für mich ist es etwas verrückt, dass Javascript alles in UTC-Zeiten speichert. Um diese Nummer zu erhalten, muss ich jedoch ein neues Date-Objekt erstellen, das die einzelnen UTC-Getter passiert, und dann schließlich getTime () aufrufen, um ...

Merc.

1
Merc

Ich bin erstaunt, wie komplex diese Frage geworden ist.

Diese sind alle identisch und ihre ganzzahligen Werte === Epochenzeit: D

console.log((new Date()).getTime() / 1000, new Date().valueOf() / 1000, (new Date() - new Date().getTimezoneOffset() * 60 * 1000) / 1000);

Glauben Sie mir nicht, checkout: http://www.epochconverter.com/

1
fliptopbox

Ich möchte klarstellen, dass das neue Date (). GetTime () tatsächlich einen UTC-Wert zurückgibt. Es ist also eine wirklich hilfreiche Methode, um Datumsangaben auf eine Weise zu speichern und zu verwalten, die für lokalisierte Zeiten unangemessen ist.

Mit anderen Worten, stören Sie sich nicht mit den UTC-Javascript-Funktionen. Verwenden Sie stattdessen einfach Date.getTime ().

Weitere Informationen zur Erklärung finden Sie hier: Wenn Javascript "(neues Datum ()). GetTime ()" von zwei verschiedenen Zeitzonen ausgeführt wird.

1
Stan Lin

Dies gibt den Zeitstempel in UTC zurück:

var utc = new Date(new Date().toUTCString()).getTime();
0
Yash Pandya

Ich denke das, was Sie erwarten ...

var currTimestamp = Date.now(), //1482905176396
    utcDateString = (new Date(currTimestamp)).toUTCString(); //"Wed, 28 Dec 2016 06:06:50 GMT"

Jetzt,

new Date(utcDateString).getTime(); //This will give you UTC Timestamp in JavaScript
0
Kapilrc