Zeitzone
Die Answer by Shiv V ist in die richtige Richtung, so weit versucht, aber ist nicht genau richtig. Die Antwort ignoriert das entscheidende Problem von time zone. Die Local…
Typen verlieren absichtlich und ignorieren Zeitzoneninformationen, das ist ihr Zweck. Aber wir wollen nur selten Zeitzoneninformationen verlieren.
Die Bestimmung von Datum und Uhrzeit hängt von der Zeitzone ab. Für jeden Moment können Datum und Uhrzeit weltweit variieren. Ein paar Minuten nach Mitternacht in Paris ist ein neuer Tag noch "gestern" in Montréal. Die Klasse Instant
definiert einen Moment auf der Timeline in UTC mit einer Auflösung von nanoseconds.
Instant now = Instant.now();
Wenn der gewünschte Termin "17:00 Uhr morgen" ist, müssen Sie die Zeitzone als Kontext angeben. Wenden Sie eine ZoneId
auf eine Instant
an, um eine ZonedDateTime
zu erhalten.
ZoneId zoneId = ZoneId.of("America/Montreal");
ZonedDateTime zdt = ZonedDateTime.ofInstant(instant , zoneId);
ZonedDateTime zdtTomorrow = zdt.plusDays(1);
Jetzt auf 5 Uhr einstellen.
LocalTime timeOfDayWhenDue = LocalTime.of(5 , 0);
ZonedDateTime zdtDeadline = zdtTomorrow.with(timeOfDayWhenDue);
Sie vergleichen können die isEqual
, isBefore
und isAfter
Methoden.
ZonedDateTime now = ZonedDateTime.now(zoneId);
boolean overdue = now.isAfter(zdtDeadline);
Sie könnten auch die zoned Datum-Zeiten zurück in UTC konvertieren. Die ZonedDateTime
Objekte und ihre jeweiligen Instant
Objekte repräsentieren den gleichen simultanen Moment auf der Zeitlinie (gleicher Moment in der Geschichte), aber aus der Sicht verschiedener Zeitzonen gesehen (America/Montreal
gegenüber UTC
).
Wenn Sie die Frist einem Kunden in Indien mitteilen möchten, passen Sie in eine andere Zeitzone. Der Datum-Uhrzeit-Wert repräsentiert das gleiche Moment auf der Zeitleiste, wird jedoch mit einer wall-clock time angezeigt, die für diesen Kunden eine Bedeutung hat.
ZoneId zoneId_Kolkata = ZoneId.of("Asia/Kolkata");
ZonedDateTime zdtDeadline_Kolkata = zdtDeadline.withZoneSameInstant(zoneId_Kolkata);
Wenn Sie angeben, Zeitzonen nicht, der aktuelle Standard-Zeitzone des JVM wird implizit, still angewandt. Nicht gut. Zum einen machen implizite Annahmen Ihren Code leicht zu missverstehen und Fehler schwieriger zu lokalisieren.Schlimmer noch, der Standard kann jederzeit ändern, wenn Sie auf einem anderen Computer bereitstellen, oder sogar während der Laufzeit zu jedem Zeitpunkt der Ausführung Ihrer App! Besser immer die gewünschte/erwartete Zeitzone angeben. Das gleiche gilt übrigens für Locale
.
Mischen Sie nicht die neuen und alten Datum-Uhrzeit-Klassen. Die neuen sind im Paket java.time enthalten, das in Java 8 und höher integriert ist. Die alten sind außerhalb des Pakets java.time und sollten vermieden werden (java.util.Date, java.util.Calendar, java.text.SimpleDateFormat). Die alte Klasse erhielt einige neue Methoden, um die Konvertierung zwischen den alten und neuen Datentypen zu erleichtern. –