Trova DST timestamp di transizione con java.util.TimeZone
Domanda
E 'possibile ottenere il timestamp di transizione precedente e successivo DST con il calendario di Java / data / TimeZone API?
Con Joda-Time
posso scrivere:
DateMidnight today = new DateMidnight(2009, 2, 24);
DateTimeZone zone = today.getZone();
DateTime previousTransition =
new DateTime(zone.previousTransition(today.getMillis()));
// 2008-10-26T02:59:59.999+02:00 for Europe/Berlin
System.out.println(previousTransition);
DateTime nextTransition =
new DateTime(zone.nextTransition(today.getMillis()));
// 2009-03-29T03:00:00.000+02:00 for Europe/Berlin
System.out.println(nextTransition);
C'è modo per farlo con le API standard di Java?
Soluzione
Non esiste una funzionalità in Java Data / Calendario / TimeZone API
Altri suggerimenti
Il migliore mi è venuta, quando avevo bisogno di tale funzionalità, è quello di utilizzare un calendario e scorrere tutto l'anno, nel fuso orario specificato, e chiedere se ogni ora di ogni giorno è l'accattonaggio o la fine dell'ora legale.
Devi farlo così perché sulla JVM di Sun, l'attuazione di TimeZone (sun.util.calendar.ZoneInfo) contiene i dati sulle transizioni di fuso orario in un certo tipo di forma "compilato".
Codice va qualcosa come questo:
public class Dst {
Date start;
Date end;
public static Dst calculate(TimeZone tz, int year) {
final Calendar c = Calendar.getInstance(tz);
c.setLenient(false);
c.set(year, Calendar.JANUARY, 1, 1, 0, 0);
c.set(Calendar.MILLISECOND, 0);
if (tz.getDSTSavings() == 0) {
return null;
}
Dst dst = new Dst();
boolean flag = false;
do {
Date date = c.getTime();
boolean daylight = tz.inDaylightTime(date);
if (daylight && !flag) {
flag = true;
dst.start = date;
}
else if (!daylight && flag) {
flag = false;
dst.end = date;
}
c.add(Calendar.HOUR_OF_DAY, 1);
}
while (c.get(Calendar.YEAR) == year);
return dst;
}
}
Naturalmente, non avrebbe molto senso per cache / Memoize il risultato di questi calcoli, ecc.
Spero che questo aiuti.
Con Java 8 è possibile utilizzare il
ZoneRules#nextTransition(Instant)
&
ZoneRules#previousTransition(Instant)
metodi per fare la stessa cosa.
https://docs.oracle .com / JavaSE / 8 / docs / api / java / ora / orario / ZoneRules.html
Sì, c'è un modo indiretto per recuperare questo da API Java. Check this out e fatemi sapere se questo funziona per il problema:
http://monisiqbal.blogspot.com /2009/12/retrieving-time-zones-dst-information.html
Questo dovrebbe dare le informazioni richieste per l'anno in corso, si può facilmente fare lo stesso per gli anni precedenti, se si desidera.