Ja, eine weitere Frage zu Date in Java und Javascript.
Die Zeitzone ist GMT + 4 (Moskau) in Java und Browser (Chrome).
%Vor%Gibt: Sun Jun 01 1975 00:00:00 GMT + 0400 (Russische Standardzeit)
%Vor%Gibt: Sa 31. Mai 23:00:00 MSK 1975
Wenn ich den Epochentyp in etwas wie 2011-2012 Jahr (nachdem die Sommerzeit in Russland abgebrochen wurde) ändern, ist die Ausgabe in Ordnung. Timezone Updater Tool lief OK.
Ist das ein Fehler oder eine dokumentierte Funktion? Gibt es eine Möglichkeit, dies zu handhaben, außer Formatieren und erneutes Parsen wie JJJJ-MM-TT HH: mm: SS oder so?
von javadoc:
Datum (langes Datum)
Ordnet ein Date-Objekt zu und initialisiert es, um die angegebene Anzahl von Millisekunden seit der als "die Epoche" bekannten Standard-Basiszeit, nämlich 1. Januar 1970, 00:00:00 GMT, darzustellen.
aus JavaScript-Referenz:
neues Datum (Millisekunden)
Millisekunden - Integer-Wert, der die Anzahl der Millisekunden seit dem 1. Januar 1970 00:00:00 UTC (Unix-Epoche) darstellt.
Ist das ein Fehler oder eine dokumentierte Funktion?
Dies ist kein Bug mit Javascript. Zumindest sehe ich keine Möglichkeit, das zu behaupten.
Die Javascript-Engine des Browsers gibt die umgewandelte Zeit in "GMT + 4" zurück. Was Sie wollen, ist offensichtlich MSK, die sich von GMT + 4 unterscheidet (wie in Ihrem Kommentar erwähnt). Javascript, das nicht über MSK bekannt ist, zählt nicht als Fehler, sondern als Mangel an einer Funktion. Vielleicht ist js "falsch", weil er nicht über detaillierte Zeitzonen verfügt, aber es ist kein Fehler.
Gibt es eine Möglichkeit, dies zu handhaben, außer Formatierung und erneutes Parsen wie JJJJ-MM-TT HH: mm: SS oder so?
Den Überblick über alle Details von Zeitzonen zu behalten, erfordert viel Arbeit. Ich kenne keine solche Codebasis, die all diese Arbeit für Javascript zur Verfügung hat. Daher glaube ich, dass Sie diese Konvertierung manuell manuell codieren müssten, wenn Sie echtes MSK verwenden möchten.
String Darstellung der Zeit (wie "Sun Jun 01 1975 00:00:00 GMT+0400"
) werden für Menschen verwendet. Der Zeitwert (Millisekunden seit dem 1. Januar 1970, UTC) wird für die Speicherung und Berechnung verwendet.
Es gibt dort keinen Fehler. In JavaScript ist der Inhalt der String-Darstellung gemäß der Spezifikation implementierungsabhängig. In Java wird laut der Dokumentation die Sommerzeit reflektiert.
Von der JavaScript-Spezifikation :
15.9.5.2
Date.prototype.toString ( )
Diese Funktion gibt einen String-Wert zurück. Der Inhalt des Strings ist abhängig von der Implementierung, aber er soll das Datum in der aktuellen Zeitzone in einer für den Benutzer lesbaren Form darstellen.
Aus der Java-Dokumentation :
%Vor%1975-05-31T20: 00: 00Z
... und ...
%Vor%1975-05-31T23: 00 + 03: 00 [Europa / Moskau]
Siehe Live-Code .
Der moderne Ansatz verwendet die Klassen java.time in Java 8 und höher.
Sie verwenden in Java alte problematische alte Datum-Zeit-Klassen, die jetzt veraltet sind. Zu den vielen Problemen in diesen Klassen gehörte die gut gemeinte, aber verwirrende Funktion der Methode Date::toString
, die beim Generieren der Zeichenfolge die aktuelle Standardzeitzone anwendete. Der interne Wert ist eigentlich immer in UTC, aber toString
erzeugt die Illusion, dass Date
eine Zeitzone hat, obwohl dies tatsächlich nicht der Fall ist. Das erklärt Ihr MSK
mystery.
[Noch verwirrender ist, dass tatsächlich eine Zeitzone ist, die tief in Date
vergraben ist, aber für diese Diskussion irrelevant ist. Die alten Date
/ Calendar
Klassen sind ein schreckliches Durcheinander. Glücklicherweise hat Java jetzt das beste Datum-Zeit-Framework auf jeder Plattform: java.time.]
Anscheinend entspricht Ihre Eingabe der Anzahl von Millisekunden seit der Unix-Epoche von 1970-01-01T00: 00: 00Z.
Die Klasse Instant
repräsentiert einen Moment auf der Timeline in UTC mit einer Auflösung von Nanosekunden (bis zu neun (9) Ziffern einer Dezimalzahl). Diese Klasse kann Ihre Eingabenummer direkt analysieren.
instant.toString (): 1975-05-31T20: 00: 00Z
Wenn Sie den gleichen Moment durch die Linse einer Wanduhr einer bestimmten Region sehen möchten, bewerben Sie sich eine Zeitzone. Wenden Sie ZoneId
an, um ein ZonedDateTime
-Objekt zu erhalten.
1975-05-31T23: 00 + 03: 00 [Europa / Moskau]
Die Ergebnisse Ihres Aufrufs für die JavaScript-Bibliothek sind mit dem Offset von +04: 00 falsch. Laut Wikipedia war die Moskauer Zeit von 1930 bis 1981 drei Stunden voraus, +03: 00. Der java.time-Rahmen liefert das ganze Jahr 1975 korrekte Ergebnisse von +03: 00. Siehe Zeit in Russland für weitere Informationen. Vorbehalt: Ich bin kein Experte in Russland / Sowjetische Zeit.
Das Framework java.time ist in Java integriert 8 und später. Diese Klassen ersetzen die problematischen alten Legacy Datum-Uhrzeit-Klassen wie java.util.Date
, Calendar
, & amp; SimpleDateFormat
.
Das Joda-Time Projekt, jetzt in Wartungsmodus , rät Migration zum java.time Klassen.
Weitere Informationen finden Sie im Oracle-Lernprogramm . Und suchen Sie nach Stack Overflow für viele Beispiele und Erklärungen. Spezifikation ist JSR 310 .
Wo erhalten Sie die Klassen java.time?
Die ThreeTen-Extra Projekt erweitert java.time um zusätzliche Klassen. Dieses Projekt ist ein Testfeld für mögliche zukünftige Erweiterungen von java.time. Möglicherweise finden Sie einige nützliche Klassen wie Interval
, %Co_de% , YearWeek
und mehr .
Tags und Links javascript java date timezone