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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/4125627/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-30 04:53:20  来源:igfitidea点击:

Get actual DST savings in milliseconds

javacalendartimezonedst

提问by zlatanmomic

I'm making analog clock in Java Swing. To calculate clock pointer angles I need:

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

  1. UTC time in milliseconds which I can get with System.currentTimeMillis()
  2. TimeZone offset
  3. TimeZone DST savings.
  1. 我可以得到的 UTC 时间(以毫秒为单位) System.currentTimeMillis()
  2. 时区偏移
  3. 时区夏令时节省。

For 2) and 3) I thought of using TimeZone.getDefault().getRawOffset()and TimeZone.getDefault().getDSTSavings().

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

But getDSTSavings()always returns 3600000regardless of current date is in winter/summer time.
It looks like it only checks to see if that zone is under DSTmanagement and if so it returns 3600000otherwise 0.
Is this a bug in getDSTSavings()?
If not then only way to get current DSTcorrection in miliseconds is to use Calendar instance like: Calendar.getInstance.get(Calendar.DST_OFFSET)?

但无论当前日期是在冬季/夏季时间,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

回答by dogbane

Here is an example of how DST is used:

以下是如何使用 DST 的示例:

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

This will print 3600000 if Daylight Saving Time is in effect in London at the specified date. Otherwise it will print 0.

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

回答by DaGGeRRz

The cal1 instance the you retrieve on the first line is in GMT+1 and that does not change regardless of what time / date you set on it. If you need to check the current timezone on every tick of the clock, you will need to retrieve a new Calendar instance at each tick.

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

As a side-note, if you're willing to add a dependency to your project - Joda Timeis a wonderful Date and Time library.

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