2009-02-24 26 views
4

是否可以使用Java日历/日期/时间区API获取前一个和下一个DST转换时间戳?
随着Joda-Time我可以这样写:使用java.util.TimeZone查找DST转换时间戳

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来做到这一点?

回答

3

有在Java日期/日历/ TimeZone的API没有这样的功能

+0

有在Java中8,看我的回答 – Gov 2017-06-19 04:28:43

4

我来到了,当我需要这样的功能,是使用日历,通过整整一年迭代,在特定的时间段,最好的和询问每天的每个小时是否是DST的乞讨或结束。

您必须这样做,因为在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; 
    } 
} 

当然,这将是有意义的缓存/ memoize的这些计算等

希望这有助于结果。

+0

这种做法是有风险的一些时间段有双夏天的时候,他们从标准到夏天,然后从夏天到夏天的两倍(通常为+2小时)。上面的代码不会捕获这些额外的转换。 – JodaStephen 2009-11-11 11:50:36

1

是的,有一种间接的方法可以从Java API检索它。检查了这一点,让我知道,如果这个工程的问题:

http://monisiqbal.blogspot.com/2009/12/retrieving-time-zones-dst-information.html

这应该给你当年所需要的信息,你可以,如果你想轻松地做同样的前几年。

+0

不适用于“欧洲/柏林”时区。打印* ... startMonth = 2,startDay = -1,... endMonth = 9,endDay = -1 ...“ * 只有日期,**没有时间** - >反对 – 2010-02-03 16:23:34