Hat Java 8 neue Java-Date-Time-API kümmern DST?
Ich bin am überlegen, die neue java 8 Date-Time-API. Ich habe ein wenig gegoogelt und gefunden, jodaTime als gute Wahl für java aber immer noch daran interessiert zu sehen, wie diese neue API funktioniert.
Ich bin die Speicherung aller Zeiten in UTC-Werte in meinem datenspeicher und die Umrechnung auf die Lokale Zeit-Zone bestimmten Wert basierend auf Benutzer-Zeitzone. Ich finde viele Artikel zeigt, wie Sie eine neue Java-Date-Time-API. Allerdings bin ich nicht sicher, ob die API kümmert sich änderungen der Sommerzeit ?
Oder haben wir keine besseren Umgang mit Datum ?
Ich bin nur zu lernen, das neue Date-API , die so dachten, hören Sie Ihre Gedanken zum Umgang mit der DateTime-und die Anzeige auf der Grundlage der Benutzer-Zeitzone.
- In kurz: ja, die Sommerzeit ist gesorgt. Java 8 date-time-API wurde geschaffen, basierend auf Joda time.
- Ich werde korrigieren Sie Ihre Begriffe um Verwirrung zu vermeiden... "Lokal" in die Datum-Zeit-Arbeit bedeutet: "für jede Lokalität", wie in "Weihnachten beginnt um Mitternacht Dezember 25, 2015". Solche lokalen Datum-Zeit hat keine Zeit-zone. In der Tat, es hat keine wirkliche Bedeutung, bis Sie passen es in einer bestimmten Zeitzone. Mitternacht am 25 kommt früher in Paris als in Montréal. Also, im Allgemeinen business-apps, die wir nur selten nutzen "Local". Sie werden Ihre gespeicherte Datum-Zeit-Werte aus der Datenbank, arbeiten mit Ihnen in Ihrem business-Logik in UTC im Allgemeinen und der Anpassung an ein
ZonedDateTime
nur für die Darstellung für einen Benutzer.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es hängt davon ab, welche Klasse Sie verwenden:
Instant
ist ein momentaner Punkt auf der globalen Zeitachse (UTC) und ist unabhängig von der Zeitzone.LocalDate
undLocalDateTime
haben kein Konzept für Zeit-zone, aber das aufrufennow()
wird natürlich geben Sie Ihre korrekte Zeit.OffsetDateTime
hat ein Zeit-zone, aber keine Unterstützung für die Sommerzeit.ZonedDateTime
hat die volle Zeit-zone unterstützen.Konvertieren zwischen Ihnen erfordert in der Regel ein Zeit-zone, also um deine Frage zu beantworten:
ja, Java 8 Date/Time kann kümmern DST, wenn Sie es richtig.
OffsetDateTime
nicht unterstützen DST, das ist genau das, was ich brauchte, danke!Die Antwort von Andreas ist spot-on richtig.
Beispiel-Code
Lassen Sie uns testen Sie es mit etwas code. Sommerzeit in den USA & Kanada läuft in diesem Jahr am 02:00 am 1. November 2015.
Beginnen wir mit der 1 BIN im "lokalen" Datum-Zeit, D. H. nicht gebunden an die timeline und ignorierte die Frage von Zeit-Zonen. Fügen Sie eine Stunde, und wir erhalten 2 BIN. Macht Sinn.
Nächsten bekommen wir bestimmte, mit einer bestimmten Zeitzone. Wir nehmen an, dass 1 BIN überall und steckte es in die Zeitzone von
America/Los_Angeles
(Westküste der USA).Fügen Sie nun eine Stunde, und sehen, was wir bekommen. Wenn die Sommerzeit ignoriert wird, bekommen wir 2 BIN. Wenn die Sommerzeit eingehalten wird, erhalten wir 1 BIN... bei erreichen der 2 BIN der Wand-Uhr-Zeit springt wieder auf 1 BIN, aber mit einem neuen offset von UTC. Dies ist umgangssprachlich bekannt als "fall back" im Herbst (Herbst).
Dump in die Konsole.
Beim ausführen, erhalten wir diese Ausgabe. Ohne Zeit-zone, 1 UHR + 1 Stunde = 2 UHR. Denken Sie daran dies sind die "lokalen" Datum-Zeit-Werte, nicht UTC. Sie stellen nur die vage Idee von einem Datum-Zeit, nicht eine tatsächliche moment auf der Zeitachse.
Aber mit der Zeit Zonen angewendet auf den Tag DST abgelaufen, erhalten wir unterschiedliche Ergebnisse. Beachten Sie, wie die time-of-Tag bleibt
01:00
aber die offset von UTC änderungen von-07:00
zu-08:00
.Vielleicht würde das klarer und leichter zu prüfen, wenn wir passen in UTC. Wir können dies einfach durch den Zugriff auf die
before
undafter
Objekte alsInstant
Objekte. DieSystem.aus.println
dann implizit fordert dietoString
Methode.Wenn Sie ausgeführt wird.
Über java.Zeit
Den java.Zeit framework ist in Java 8 und höher. Diese Klassen verdrängen die lästige alte legacy Datum-Zeit-Klassen wie
java.util.Date
,Calendar
, &" = SimpleDateFormat
.Den Joda-Time Projekt, jetzt in Wartung-Modus, rät der migration auf die java.Zeit Klassen.
Um mehr zu erfahren, siehe die Oracle Tutorial. Und die Suche Stack Overflow für viele Beispiele und Erklärungen. Spezifikation JSR 310.
Können Sie exchange java.Zeit Objekte direkt mit Ihrer Datenbank. Verwenden Sie eine JDBC-Treiber kompatibel mit JDBC 4.2 oder später. Keine Notwendigkeit für Streicher, keine Notwendigkeit für
java.sql.*
Klassen.Wo erhalten Sie die java.Zeit-Klassen?
Den ThreeTen-Extra Projekt erweitert die java.mal mit zusätzlicher Klassen. Dieses Projekt ist ein Testgelände für mögliche künftige Erweiterungen zu java.Zeit. Sie finden möglicherweise einige nützliche Klassen, die hier wie
Interval
,YearWeek
,YearQuarter
, und mehr.Ja, die Java-API nehmen Sommerzeit-änderungen zu berücksichtigen.
In diesem tutorial wird erklärt ganz gut, wie konvertieren von Daten zwischen Zeitzonen und wie wählen Sie die richtige Klasse zur Darstellung eines Datums:
https://docs.oracle.com/javase/tutorial/datetime/iso/timezones.html
Können Sie auch einen Blick auf diese Klasse repräsentiert die Regeln, die für jede zone:
http://docs.oracle.com/javase/8/docs/api/java/time/zone/ZoneRules.html
Insbesondere, diese Methode kann Ihnen sagen, ob ein bestimmter Augenblick in der Sommerzeit:
http://docs.oracle.com/javase/8/docs/api/java/time/zone/ZoneRules.html#isDaylightSavings-java.time.Instant-