ZonedDateTime
scheint nicht erkennen zu lassen , wenn das Datum in einem DST Lücke oder Überlappung gegeben ist. Die docs sagen für das of
Verfahren (a Schaffung ZonedDateTime
):
Im Falle einer Überlappung, wenn die Uhren zurück gesetzt werden, gibt es zwei gültige Offsets. Bei dieser Methode wird die frühere Offset typischerweise auf „Sommer“ entspricht.
Im Falle einer Lücke, wenn die Uhren vorwärts springen, gibt es keine gültige Offset. Stattdessen wird die lokale Datum-Zeit später durch die Länge des Spaltes eingestellt werden.
^ Wie oben zu lesen, wird diese Methode nur einen Wert zurückgeben aber wird mich nicht erlauben, zu wissen, ob eine DST Lücke oder Überlappung auftritt.
Ich würde gerne wissen, ob das Datum in einem Spalt oder Überlappung vorgesehen ist, und haben das Startdatum und das Enddatum der Lücke oder Überlappung.
Zum Beispiel:
„1920.09.01 00.10“ für Zeitzone „Afrika / Accra“ ist in einer DST Lücke .
Der Spalt ist von "1920.09.01 00: 00: 00 + 00: 00" bis "1920.09.01 00: 20: 00 + 00: 20" .
„1920.12.30 23.50“ für die Zeitzone „Afrika / Accra“ ist in einer DST überlappen .
Die Überlappungs betreffen die Perioden:
"1920.12.30 23: 40: 00 + 00: 20" bis "1920.12.31 00: 00: 00 + 00: 20" und
„1920.12.30 23.40: 00 + 00: 00" bis "1920.12.31 00: 00: 00 + 00: 00"
Wie kann ich diese Daten im Fall einer Lücke oder Überlappung wie in den obigen Beispielen erhalten?
Ich glaube nicht , es physikalisch möglich ist , eine zu schaffen , ZonedDateTime
die in einem Spalte Übergang ist, weil das lokale Datum Mal , dass ein Spalt Übergang über springt technisch „nicht existent“, und ZonedDateTime
ist sehr streng darüber. Je nach Ihrer Methode, wird es entweder eine Ausnahme oder anpassen , um eine Zeit werfen, die es gibt.
Sie sollten diese Überprüfung bei tun LocalDateTime
s, nicht ZonedDateTime
s.
ZoneRules
hat diese sehr bequeme Methode genannt , getTransition
die eine nimmt LocalDateTime
und gibt Ihnen ein ZoneOffsetTransition
, die einen Spalt / Überlappung Übergang, oder stellt , null
ob das Datum Zeit keinen Übergang hat. Beispiel:
System.out.println(ZoneId.of("Africa/Accra").getRules()
.getTransition(LocalDateTime.of(1920, 9, 1, 00, 10)));
Ausgabe:
Transition[Gap at 1920-09-01T00:00Z to +00:20]
Anschließend können Sie erhalten alle Informationen , die Sie wollen (Start, Ende, versetzt vor, Versatz nach Lücken- / Überlappung usw.) aus dem ZoneOffsetTransition
Objekt.