是否可以使用Java Calendar / Date / TimeZone API获取上一个和下一个DST转换时间戳?
使用Joda-Time
我可以写:
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);
是否可以使用标准Java API执行此操作?
答案 0 :(得分:4)
在Java Date / Calendar / TimeZone API中没有这样的功能
答案 1 :(得分:4)
当我需要这样的功能时,我提出的最好的方法是使用日历并在指定的时区内迭代整年,并询问每天的每个小时是否是DST的乞讨或结束。 / p>
你必须这样做,因为在Sun的JVM上,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;
}
}
当然,缓存/记忆这些计算的结果等是有意义的。
希望这有帮助。
答案 2 :(得分:1)
是的,有一种间接的方法可以从Java API中检索它。检查一下,让我知道这是否适用于该问题:
http://monisiqbal.blogspot.com/2009/12/retrieving-time-zones-dst-information.html
这应该为您提供当年所需的信息,如果您愿意,您可以轻松地为前几年做同样的事情。
答案 3 :(得分:1)
使用Java 8,您可以使用
ZoneRules#nextTransition(Instant)
&安培;
ZoneRules#previousTransition(Instant)
做同样事情的方法。
https://docs.oracle.com/javase/8/docs/api/java/time/zone/ZoneRules.html