我正在Java Swing中製作模擬時鐘。爲了計算時鐘指針的角度,我需要:以毫秒爲單位以毫秒爲單位獲得實際的DST節省量
- UTC時間,我可以得到
System.currentTimeMillis()
- 區偏移
- 時區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
是的,那就是我一直在尋找的東西。偏移只是區域和時間相關的。現在我不需要在每個打勾上創建新的日曆實例。而是在開始時鐘時檢測當前區域。 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