gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:12:25 28 4
gpt4 key购买 nike

我正在用 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 实例,例如: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

最佳答案

下面是夏令时用法的示例:

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

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

关于java - 以毫秒为单位获得实际的 DST 节省,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4125627/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com