以毫秒为单位获得实际的DST节省

时间:2010-11-08 16:11:49

标签: java calendar timezone dst

我在Java Swing中制作模拟时钟。要计算我需要的时钟指针角度:

  1. UTC时间(以毫秒为单位)System.currentTimeMillis()
  2. TimeZone offset
  3. TimeZone DST节省。
  4. 对于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
    

2 个答案:

答案 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是一个很棒的日期和时间库。