2010-11-08 83 views
8

我正在Java Swing中製作模擬時鐘。爲了計算時鐘指針的角度,我需要:以毫秒爲單位以毫秒爲單位獲得實際的DST節省量

  1. UTC時間,我可以得到System.currentTimeMillis()
  2. 區偏移
  3. 時區DST節約。

對於2)和3)我想用 TimeZone.getDefault().getRawOffset()TimeZone.getDefault().getDSTSavings()的。

getDSTSavings()總是返回3600000無論當前日期是在冬季/夏季時間。
看起來它只檢查該區域是否在DST管理下,如果是,則返回3600000否則0
這是一個bug在getDSTSavings()
如果不是,那麼只有獲得當前DST毫秒校正的方法是使用Calendar實例:Calendar.getInstance.get(Calendar.DST_OFFSET)

Calendar cal1 = Calendar.getInstance(TimeZone.getDefault());  //currentZone: CET/CEST +1/+2, GMT+1:00 
System.out.println("System time, " + System.currentTimeMillis()); //UTC current milis 
System.out.println("Calendar time, " + cal1.getTime().getTime()); //UTC current milis 
System.out.println("Calendar milis, " + cal1.getTimeInMillis());  //UTC current milis 
System.out.println("Calendar Zone Offset: " + cal1.get(Calendar.ZONE_OFFSET)); 
System.out.println("Calendar DST Offset: " + cal1.get(Calendar.DST_OFFSET)); 
System.out.println("Calendar Zone Offset: " + cal1.getTimeZone().getRawOffset()); 
System.out.println("Calendar DST Offset: " + cal1.getTimeZone().getDSTSavings()); 
System.out.println(""); 

// Winter time, CET 
cal1.set(2010, 11, 15, 14, 15, 5); 
System.out.println("Calendar milis, " + cal1.getTimeInMillis()); //UTC 
System.out.println("Calendar Zone Offset: " + cal1.get(Calendar.ZONE_OFFSET)); // 3600000 correct 
System.out.println("Calendar DST Offset: " + cal1.get(Calendar.DST_OFFSET)); // 0 correct 
System.out.println("Calendar Zone Offset: " + cal1.getTimeZone().getRawOffset()); // 3600000 correct 
System.out.println("Calendar DST Offset: " + cal1.getTimeZone().getDSTSavings()); // 3600000 wrong !!! 
System.out.println(""); 

// Summer time - CEST 
cal1.set(2010, 8, 15, 14, 15, 5); 
System.out.println("Calendar milis, " + cal1.getTimeInMillis()); //UTC 
System.out.println("Calendar Zone Offset: " + cal1.get(Calendar.ZONE_OFFSET)); // 3600000 correct 
System.out.println("Calendar DST Offset: " + cal1.get(Calendar.DST_OFFSET)); // 3600000 correct 
System.out.println("Calendar Zone Offset: " + cal1.getTimeZone().getRawOffset()); // 3600000 correct 
System.out.println("Calendar DST Offset: " + cal1.getTimeZone().getDSTSavings()); // 3600000 correct 

回答

12

這裏是DST是如何使用的例子:

TimeZone london = TimeZone.getTimeZone("Europe/London"); 
System.out.println(london.getOffset(date.getTime())); 

這將打印3600000如果實行夏令時是在指定的日期在倫敦的效果。否則它將打印0.

+3

是的,那就是我一直在尋找的東西。偏移只是區域和時間相關的。現在我不需要在每個打勾上創建新的日曆實例。而是在開始時鐘時檢測當前區域。 final TimeZone timeZone = TimeZone.getDefault(); final long utcTime = System.currentTimeMillis(); final long timeOffset = timeZone.getOffset(utcTime); final long t = utcTime + timeOffset; – zlatanmomic 2010-11-09 08:27:48

2

您在第一行檢索到的cal1實例在GMT + 1中,不管您設置的時間/日期如何,它都不會更改。如果您需要在時鐘的每個時鐘上查看當前時區,則需要在每個時鐘上檢索新的Calendar實例。

作爲一個側面說明,如果你願意添加一個依賴項到你的項目 - Joda Time是一個美好的日期和時間庫。

相關問題