2016-08-03 12 views
10

Ich muss vorhersagen, wann die nächsten mindestens 2 Zeitzonenübergänge für eine bestimmte Zeitzone sein werden.Ermitteln zukünftige Zeitzonenübergänge

Java 8 bietet die neue java.time API, speziell java.time.zone. ZoneRules.getTransitions() sieht genau so aus, wie ich es brauche, aber es enthält nichts über das Jahr 2010 hinaus für "Australien/Sydney".

Was ist die zuverlässigste Methode zur Bestimmung der nächsten 2 Zeitzonenübergänge Datum/Zeit/Offset?

+0

@Thirler Sie können nicht buchstabieren;) – pstanton

+0

Sorry für die :) – Thirler

+3

Im allgemeinen dies nicht getan, weil die Regeln werden kann zu in der Zukunft anwenden können von den Regierungen geändert werden. Sie ändern sich manchmal kurzfristig. Es sollte möglich sein, die nächsten * know * Übergänge zu erhalten. – Raedwald

Antwort

12

Die Methode ZoneRules.getTransitions() listet nicht alle Übergänge bis unendlich in die Zukunft auf (offensichtlich). Dies erhält die nächsten zwei Übergänge:

ZoneId zoneId = ZoneId.of("Australia/Sydney"); 
ZoneRules rules = zoneId.getRules(); 

ZoneOffsetTransition nextTransition = rules.nextTransition(Instant.now()); 
System.out.println("Next transition at: " + 
     nextTransition.getInstant().atZone(zoneId)); 

ZoneOffsetTransition nextNextTransition = 
     rules.nextTransition(nextTransition.getInstant()); 
System.out.println("Next transition after that at: " + 
     nextNextTransition.getInstant().atZone(zoneId)); 

Output:

nächste Übergang auf: 2016-10-02T03: 00 + 11: 00 [Australia/Sydney]

nächsten Übergang nach, dass an: 2017-04-02T02: 00 + 10: 00 [Australien/Sydney]

+2

ja, immer noch überraschte 'getTransitions' nicht zumindest alle bis heute (dh alle Vergangenheit) - danke für die Lösung, funktioniert super. – pstanton

+1

'getTransitions()' (oder das nicht existierende 'getFutureTransitions()') ist das beste Beispiel, das ich je gesehen habe, was ein nützlicher unendlicher 'Stream' sein könnte. – Thirler

+3

@Thirler Es ist nicht so schwer, ein eigenes 'getFutureTransitions()' mit einem unendlichen 'Stream' zu erstellen:' Stream.iterate (rules.nextTransition (Instant.now()), t -> rules.nextTransition (t. getInstant())) ' – Flown

Verwandte Themen