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
Get actual DST savings in milliseconds
提问by zlatanmomic
I'm making analog clock in Java Swing. To calculate clock pointer angles I need:
我正在 Java Swing 中制作模拟时钟。要计算时钟指针角度,我需要:
- UTC time in milliseconds which I can get with
System.currentTimeMillis()
- TimeZone offset
- TimeZone DST savings.
- 我可以得到的 UTC 时间(以毫秒为单位)
System.currentTimeMillis()
- 时区偏移
- 时区夏令时节省。
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 3600000
regardless of current date is in winter/summer time.
It looks like it only checks to see if that zone is under DST
management and if so it returns 3600000
otherwise 0
.
Is this a bug in getDSTSavings()
?
If not then only way to get current DST
correction 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是一个很棒的日期和时间库。