获取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
及其nextTransition
和previousTransition
方法获取相同的信息。