Beim Schreiben einer Webanwendung ist es sinnvoll, ( datenseitig ) alle Datenzeiten in der Datenbank als UTC-Zeitstempel zu speichern .
Ich war erstaunt, als ich bemerkte, dass man in Bezug auf die Zeitzonenmanipulation in JavaScript nicht viel von Haus aus tun konnte.
Ich habe das Date-Objekt ein wenig erweitert. Ist diese Funktion sinnvoll? Grundsätzlich wird jedes Mal, wenn ich etwas an den Server sende, ein Zeitstempel mit dieser Funktion formatiert ...
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 mir auch bei der Leistung nicht so sicher.
javascript
timezone
utc
Merc
quelle
quelle
new Date().toString()
zeigt Ihnen die aktuelle Zeitzonen-new Date().toUTCString()
Zeitdarstellung an, zeigt Ihnen die UTC-Zeitrepräsentation an,new Date().getTime()
ist jedoch immer UTC , da die Unix-Zeit wie folgt definiert ist: "Die Unix-Zeit (auch als POSIX-Zeit oder Epochenzeit bezeichnet) ist ein System zur Beschreibung von Zeitpunkten in der Zeit, definiert als die Anzahl der Sekunden, die seit 00:00:00 Coordinated Universal Time (UTC), Donnerstag, 1. Januar 1970, vergangen sind, ohne Schaltsekunden. "Antworten:
Auf diese Weise erstellte Daten verwenden die lokale Zeitzone, wodurch das erstellte Datum falsch wird. Um die Zeitzone eines bestimmten Datumsobjekts festzulegen, müssen Sie es aus einer Datumszeichenfolge erstellen, die die Zeitzone enthält. (Ich hatte Probleme, das in einem älteren Android-Browser zum Laufen zu bringen.)
Beachten Sie, dass
getTime()
Millisekunden und keine einfachen Sekunden zurückgegeben werden.Für einen UTC / Unix-Zeitstempel sollte Folgendes ausreichen:
Der aktuelle Zeitzonenversatz wird in das Ergebnis einbezogen. Für eine Zeichenfolgendarstellung funktioniert die Antwort von David Ellis .
Zu klären:
Diese Eingabe wird als Ortszeit behandelt . Wenn die UTC-Zeit abgelaufen ist, unterscheiden sich die Ergebnisse. Beobachten Sie (ich bin gerade in GMT +02: 00 und es ist 07:50):
Beachten Sie auch, dass
getUTCDate()
dies nicht ersetzt werden kanngetUTCDay()
. Dies liegt daran ,getUTCDate()
kehrt der Tag des Monats ; während,getUTCDay()
gibt den Tag der Woche .quelle
new Date()
, das erstellt ein neues Datum aus Ihrer UTC-Eingabe, behandelt es jedoch als lokales Datum / Uhrzeit. 2) Ja, Sie solltenMath.floor(this.getTime() / 1000)
in diesem Fall verwenden.Sie können dies auch mit getTimezoneOffset und getTime tun.
quelle
var tt = new Date('Thu Jan 01 1970 08:00:00 GMT+0800 (China Standard Time)'); (tt.getTime() - tt.getTimezoneOffset()*60*1000)/1000
. Es scheinttt.getTime() - tt.getTimezoneOffset()
richtig fürGMT+0800
.var UTCseconds = (Math.floor(x.getTime()/1000) + x.getTimezoneOffset()*60)
new Date()
dass ein timezone..which enthält irgendwie besiegt den Zweck zu versuchen , es in js zu tun ..Der einfachste Weg, UTC-Zeit in einem herkömmlichen Format zu erhalten, ist wie folgt:
quelle
Ich denke tatsächlich, dass Datumswerte in js weitaus besser sind als die C # DateTime-Objekte. Die C # DateTime-Objekte haben eine Kind-Eigenschaft, aber 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 Datumswerte einen zugrunde liegenden UTC-Wert, der unabhängig von den von Ihnen durchgeführten Offest- oder Zeitzonen-Konvertierungen weitergegeben und bekannt ist. Meine größte Beschwerde bezüglich des Date-Objekts ist die Menge an undefiniertem Verhalten, die Browser-Implementierer ausgewählt haben, was Personen, die Datumsangaben in js angreifen, mit Versuch und Irrtum verwirren kann, als die Spezifikation zu lesen. Die Verwendung von iso8601.js löst dieses unterschiedliche Verhalten, indem eine einzelne Implementierung des Date-Objekts definiert wird.
Standardmäßig heißt es in der Spezifikation, dass Sie Datumsangaben mit einem erweiterten ISO 8601-Datumsformat wie erstellen können
Auf diese Weise können Sie die genaue UTC-Zeit ableiten.
Wenn Sie den Datumswert an den Server zurückgeben möchten, den Sie aufrufen würden
oder wenn Sie lieber mit einem Millisekunden-Zeitstempel arbeiten möchten (Anzahl der Millisekunden ab dem 1. Januar 1970 UTC)
ISO 8601 ist ein Standard. Sie können nicht verwechselt werden, was eine Datumszeichenfolge bedeutet, wenn Sie den Datumsversatz einschließen. Für Sie als Entwickler bedeutet dies, dass Sie sich nie selbst mit lokalen Zeitumrechnungen befassen müssen . Die lokalen Zeitwerte dienen ausschließlich dem Benutzer und Datumswerte werden standardmäßig in ihrer lokalen Zeit angezeigt. Bei allen lokalen Zeitmanipulationen können Sie dem Benutzer etwas Sinnvolles anzeigen und Zeichenfolgen aus Benutzereingaben konvertieren. Es wird empfohlen, so schnell wie möglich in UTC zu konvertieren, und das Objekt js Date macht dies ziemlich trivial.
Auf der anderen Seite gibt es nicht viel Spielraum, um die Zeitzone oder das Gebietsschema für den Client zu erzwingen (was mir bekannt ist), was für website-spezifische Einstellungen ärgerlich sein kann, aber ich denke, der Grund dafür ist, dass es sich um einen Benutzer handelt 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 möchten.
quelle
Im Allgemeinen müssen Sie auf der Clientseite nicht viel von "Zeitzonenmanipulation" ausführen. In der Regel versuche ich, UTC-Daten in Form von
ticks
oder " Anzahl Millisekunden seit Mitternacht des 1. Januar 1970 " zu speichern und damit zu arbeiten . Dies vereinfacht das Speichern, Sortieren und Berechnen von Offsets erheblich und befreit Sie vor allem von den Kopfschmerzen bei den Anpassungen der "Sommerzeit". Hier ist ein kleiner JavaScript-Code, den ich verwende.So erhalten Sie die aktuelle UTC-Zeit:
Dann müssen Sie im Allgemeinen Datum / Uhrzeit für den Endbenutzer für die lokale Zeitzone und das Format formatieren. Im Folgenden werden alle Komplexitäten der Datums- und Uhrzeitformate auf dem Clientcomputer berücksichtigt:
Also folgendes Beispiel:
Gibt Folgendes zurück (für mein Gebietsschema in US-Englisch):
quelle
getTimezoneOffset
Wert in IhrergetCurrentTimeUTC
Funktion hinzufügen , geben Sie tatsächlich einen anderen Zeitpunkt zurück. Das Ergebnis vongetTime
ist bereits in UTC.tmLoc.getTime()
ist ein Versatz gegen die Ortszeit. Das ist einfach zu überprüfen, ob Sie Zugriff auf etwas haben, auf dem JavaScript ausgeführt wird.getTime
, welcher Punkt Sie auf den in §15.9.5 definierten "Zeitwert" verweist , der a istPrimitiveValue
, wie in §15.9.3.3 explizit als UTC festgelegt.tmLoc
über erhaltennew Date()
, ist es das gleiche. Die Zeitzone wirkt sich auf die ZeichenfolgenausgabetmLoc.toString()
und ähnliche Elemente aus, jedoch nicht auftmLoc.getTime()
die Anzahl der Millisekunden seit Mitternacht 1970-01-01 in UTC.//The offset is in minutes -- convert it to ms
Ich denke, das ist eine bessere Lösung
quelle
Wenn Sie einen Einzeiler wünschen , kann der UTC-Unix-Zeitstempel in JavaScript wie folgt erstellt werden:
Dies berücksichtigt die Zeitzone des Systems. Es ist im Grunde die Zeit, die seit der Epoche in Sekunden vergangen ist.
Wie es funktioniert:
new Date()
.unary +
vor der Objekterstellung hinzufügen, in den Sie ihn konvertieren möchtentimestamp integer
. :+new Date()
.+new Date() / 1000
~~(+new Date())
quelle
tilde
nichttilda
(sic). Leider kann ich keinen Tippfehler entfernen, ich muss mindestens 6 Zeichen bearbeiten. Glatt, Stapelaustausch, glattIch möchte klarstellen, dass new Date (). GetTime () tatsächlich einen UTC-Wert zurückgibt. Daher ist es eine sehr hilfreiche Methode, Datumsangaben auf eine Weise zu speichern und zu verwalten, die für lokalisierte Zeiten unabhängig ist.
Mit anderen Worten, kümmern Sie sich nicht um alle UTC-Javascript-Funktionen. Verwenden Sie stattdessen einfach Date.getTime ().
Weitere Informationen zur Erklärung finden Sie hier: Wenn Javascript "(new Date ()). GetTime ()" aus 2 verschiedenen Zeitzonen ausgeführt wird.
quelle
Ich benutze folgendes:
Sobald Sie diese Methode definiert haben, können Sie Folgendes tun:
quelle
DateTime dt = new DateTime ("2018-07-15T02:36:00+02:00");
this.getTime()
gibt einen UTC-Versatz zurück. Wenn Sie den lokalen Zeitzonenversatz subtrahieren, wird dieser lokal und nicht UTC. GetUTCTime gibt also einen lokalen Versatz zurück, nicht UTC.Ich bin erstaunt, wie komplex diese Frage geworden ist.
Diese sind alle identisch und ihre ganzzahligen Werte alle === EPOCH-Zeit: D.
Glauben Sie mir nicht, Kasse: http://www.epochconverter.com/
quelle
Da
new Date().toUTCString()
gibt eine Zeichenfolge zurück, wie"Wed, 11 Oct 2017 09:24:41 GMT"
Sie die letzten 3 Zeichen in Scheiben schneiden und die in Scheiben geschnittene Zeichenfolge annew Date()
folgende Adresse übergeben können :quelle
BEARBEITEN: Der folgende Code funktioniert NICHT. Ich ging immer davon aus, dass new Date (). 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 folgende Code führt also eine grobe Überanpassung durch. Dank euch allen!]
Zunächst einmal vielen Dank für Ihre fantastischen Einblicke. Ich denke, meine Frage hatte den falschen Titel ... es hätte lauten sollen "Holen Sie sich den UTC-Unix-Zeitstempel für ein vorhandenes Datum".
Also, wenn ich ein Datumsobjekt habe:
Ich war nach einer Funktion, die mir "The UTC Unix Timestamp" sagen würde.
Diese Funktion scheint der wahre Trick zu sein:
Beachten Sie, dass es auf "this" funktioniert. Dies bedeutet, dass ich Folgendes tun kann:
Und erhalten Sie die Anzahl der Sekunden seit dem 1. Januar 1970 in Unix-Zeit. Richtig?
Für mich ist es ein bisschen verrückt, dass Javascript alles in UTC-Zeiten speichert, aber um diese Nummer zu erhalten, muss ich ein neues Date-Objekt erstellen, das die einzelnen UTC-Getter übergibt, und schließlich getTime () dafür aufrufen ...
Merc.
quelle
getUTCUnixTime
erhält die falsche Zeit, und JavaScript bietet eine einfache Möglichkeit, den Unix-ZeitstempelDate
mithilfe dergetTime
Methode von einem Objekt abzurufen . Alle anderen Antworten anzeigen.Ich denke das, was Sie erwarten ...
Jetzt,
quelle
Sobald Sie dies tun
Es ist bereits UTC Zeitstempel
Ich habe auf https://www.unixtimestamp.com/index.php getestet
quelle
Mit day.js
Im Browser:
In node.js:
Sie erhalten einen UTC-Unix-Zeitstempel ohne Millisekunden.
quelle
Dies gibt den Zeitstempel in UTC zurück:
quelle
new Date(new Date().toUTCString())
gibt Mi 04. Oktober 2017 07:20:14 GMT + 0200 (GMT + 02: 00)