【问题标题】:Get actual DST savings in milliseconds以毫秒为单位获得实际的 DST 节省
【发布时间】:2011-05-06 18:05:06
【问题描述】:

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

  1. 我可以通过System.currentTimeMillis() 获得的UTC 时间(以毫秒为单位)
  2. 时区偏移
  3. TimeZone DST 节省。

对于 2) 和 3) 我想使用 TimeZone.getDefault().getRawOffset()TimeZone.getDefault().getDSTSavings()

但是getDSTSavings() 总是返回3600000,无论当前日期是在冬季/夏季时间。
看起来它只检查该区域是否在DST 管理下,如果是,则返回3600000,否则返回0
这是getDSTSavings() 中的错误吗?
如果不是,那么在毫秒内获得当前DST 校正的唯一方法是使用日历实例,例如: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

【问题讨论】:

    标签: java calendar timezone dst


    【解决方案1】:

    这里是如何使用 DST 的示例:

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

    如果夏令时在指定日期在伦敦生效,这将打印 3600000。否则会打印 0。

    【讨论】:

    • 是的,这就是我想要的。偏移量仅取决于区域和时间。现在我不需要在每个刻度上创建新的日历实例。相反,只需在启动时钟时检测当前区域。最终时区 timeZone = TimeZone.getDefault();最终长 utcTime = System.currentTimeMillis();最终长 timeOffset = timeZone.getOffset(utcTime);最终长 t = utcTime + timeOffset;
    【解决方案2】:

    您在第一行检索的 cal1 实例位于 GMT+1 中,无论您在其上设置什么时间/日期,它都不会改变。如果您需要在时钟的每个滴答声中检查当前时区,则需要在每个滴答声中检索一个新的日历实例。

    附带说明,如果您愿意为您的项目添加依赖项 - Joda Time 是一个很棒的日期和时间库。

    【讨论】:

      猜你喜欢
      • 2015-01-24
      • 1970-01-01
      • 2019-08-29
      • 2013-05-26
      • 1970-01-01
      • 1970-01-01
      • 2012-03-26
      • 1970-01-01
      • 2022-08-11
      相关资源
      最近更新 更多