2016-08-03 12 views
10

Potrzebuję przewidzieć, kiedy następne co najmniej 2 przejścia stref czasowych będą dotyczyły konkretnej strefy czasowej.Określanie przyszłych przejść stref czasowych

Java 8 oferuje nowy interfejs API java.time, w szczególności java.time.zone. ZoneRules.getTransitions() wygląda dokładnie to, czego potrzebuję, ale nie zawiera niczego poza rok 2010 dla "Australia/Sydney".

Jaki jest najbardziej niezawodny sposób określenia następnej daty/czasu/przesunięcia następnej strefy czasowej?

+0

@Thirler nie może oznaczać;) – pstanton

+0

przepraszam za to :) – Thirler

+3

W ogóle nie da się zrobić, ponieważ przepisy do zastosowanie w przyszłości może zostać zmienione przez rządy. Czasami zmieniają się w krótkim czasie. Powinno być możliwe uzyskanie następnych * znanych * przejść. – Raedwald

Odpowiedz

12

Metoda ZoneRules.getTransitions() nie wyświetla wszystkich przejść do nieskończoności w przyszłości (oczywiście). To dostaje kolejne dwa przejścia:

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)); 

wyjściowa:

Następny przejście na: 2016-10-02T03: 00 + 11: 00 [Australia/Sydney]

Następny przejście po tym w: 2017-04-02T02: 00 + 10: 00 [Australia/Sydney]

+2

tak, nadal zaskoczony "getTransitions" nie ma co najmniej wszystkich list do dzisiaj (tj. Wszystkie przeszłe) - dzięki za rozwiązanie, działa świetnie. – pstanton

+1

'getTransitions()' (lub brak istniejącego 'getFutureTransitions()') jest najlepszym przykładem, jaki kiedykolwiek widziałem, co mogło być użytecznym nieskończonym 'Stream'. – Thirler

+3

@Thirler Nie jest trudno zbudować własne 'getFutureTransitions()' z nieskończonym 'Stream':' Stream.iterate (rules.nextTransition (Instant.now()), t -> rules.nextTransition (t. getInstant())) ' – Flown

Powiązane problemy