我在Java Swing中制作模拟时钟。要计算我需要的时钟指针角度:
System.currentTimeMillis()
对于2)和3)我想到了使用
TimeZone.getDefault().getRawOffset()
和TimeZone.getDefault().getDSTSavings()
。
但getDSTSavings()
始终返回3600000
,无论当前日期是冬季/夏季时间
看起来它只检查该区域是否在DST
管理下,如果是,则返回3600000
,否则0
。
这是getDSTSavings()
中的错误吗?
如果没有,那么只有以毫秒为单位获得当前DST
修正的方法是使用像Calendar.getInstance.get(Calendar.DST_OFFSET)
这样的Calendar实例?
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
答案 0 :(得分:12)
以下是如何使用DST的示例:
TimeZone london = TimeZone.getTimeZone("Europe/London");
System.out.println(london.getOffset(date.getTime()));
如果夏令时在指定日期在伦敦生效,则会打印3600000。否则它将打印0。
答案 1 :(得分:2)
您在第一行检索的cal1实例是GMT + 1,无论您在其上设置的时间/日期如何,它都不会更改。如果您需要在时钟的每个刻度上检查当前时区,则需要在每个刻度处检索新的Calendar实例。
作为旁注,如果您愿意为项目添加依赖项 - Joda Time是一个很棒的日期和时间库。