获取Java中时区的夏令时转换日期

我想知道在Java中最简单的方法是获取将来夏令时更改的日期列表。

这样做的一个相当不公平的方法是简单地迭代一堆多年的日子,对TimeZone.inDaylightTime()进行测试。 这会有效,而且我并不担心效率,因为这只需要在每次我的应用程序启动时运行,但我想知道是否有更简单的方法。

如果你想知道为什么我这样做,那是因为我有一个需要处理包含UTC时间戳的第三方数据的javascript应用程序。 我想要一种可靠的方法在客户端从GMT转换到EST。 请参阅Javascript – Unix时间到特定时区我写了一些javascript,它会做,但我想从服务器获得精确的过渡日期。

由于DateTimeZone.nextTransition方法, Joda Time (一如既往)使这很容易。 例如:

 import org.joda.time.*; import org.joda.time.format.*; public class Test { public static void main(String[] args) { DateTimeZone zone = DateTimeZone.forID("Europe/London"); DateTimeFormatter format = DateTimeFormat.mediumDateTime(); long current = System.currentTimeMillis(); for (int i=0; i < 100; i++) { long next = zone.nextTransition(current); if (current == next) { break; } System.out.println (format.print(next) + " Into DST? " + !zone.isStandardOffset(next)); current = next; } } } 

输出:

 25-Oct-2009 01:00:00进入夏令时? 假
 28-Mar-2010 02:00:00进入夏令时? 真正
 31-Oct-2010 01:00:00进入夏令时? 假
 27-Mar-2011 02:00:00进入夏令时? 真正
 30-Oct-2011 01:00:00进入夏令时? 假
 25-Mar-2012 02:00:00进入夏令时? 真正
 28-Oct-2012 01:00:00进入夏令时? 假
 31-Mar-2013 02:00:00进入夏令时? 真正
 27-Oct-2013 01:00:00进入夏令时? 假
 30-Mar-2014 02:00:00进入夏令时? 真正
 26-Oct-2014 01:00:00进入夏令时? 假
 29-Mar-2015 02:00:00进入夏令时? 真正
 25-Oct-2015 01:00:00进入夏令时? 假
 ...

使用Java 8,您可以使用ZoneRules及其nextTransitionpreviousTransition方法获取相同的信息。