2009-02-24 49 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