Лучшее, что мне пришло в голову, когда мне понадобилась такая функциональность, - это использовать Календарь и выполнять итерацию по всему году в указанном часовом поясе и спрашивать, является ли каждый час каждого дня началом или окончанием летнего времени.
Вы должны сделать это так, потому что в JVM от Sun реализация TimeZone (sun.util.calendar.ZoneInfo) хранит данные о переходах часовых поясов в некой «скомпилированной» форме.
Код выглядит примерно так:
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;
}
}
Конечно, имеет смысл кэшировать / запоминать результаты этих вычислений и т. Д.
Надеюсь, это поможет.