【发布时间】:2016-09-28 18:19:27
【问题描述】:
我有一个桌面应用程序(必须在 Windows 中运行),它需要在执行特定操作时记录时间戳,但我在调用日历时得到的时间带有错误的时间和正确的时区。 运行一些测试,我发现如果我取消选中 Windows 时区设置上的“自动调整夏令时时钟”复选框,日历会提供正确的时间。 Linux 上不存在此问题。不幸的是,我不允许在 Windows 机器上进行任何更改。
更多信息:
- Windows 时钟中设置的时区:“美国/圣地亚哥”(-4:00)。
-
测试代码:
public class Test2 { public static void main(String[] args) { SimpleDateFormat sdfBase = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss"); long milisBase = Calendar.getInstance().getTimeInMillis(); Calendar calenBase = Calendar.getInstance(); Date fechaBase = calenBase.getTime(); String fechaStringBase = sdfBase.format(fechaBase); TimeZone tzBase = Calendar.getInstance().getTimeZone(); System.out.println("Time (in mill): " + milisBase); System.out.println("TimeZone: " + tzBase.getDisplayName() + " - " + tzBase.getID() + " -Offset: " + tzBase.getRawOffset()); System.out.println("Date Calendar: " + fechaBase); System.out.println("Fecha StringBase: " + fechaStringBase); } }
得到以下结果:
选中“自动调整夏令时时钟”(Windows 时钟:17:50:07)
Time (in mill): 1464645007120
TimeZone: Chile Time - America/Santiago -Offset: -10800000
Date Calendar: Mon May 30 18:50:07 CLT 2016
Fecha StringBase: 30-05-2016 18:50:07
取消选中“自动调整夏令时时钟”(Windows 时钟:17:50:37)
Time (in mill): 1464645037914
TimeZone: GMT-04:00 - GMT-04:00 -Offset: -14400000
Date Calendar: Mon May 30 17:50:37 GMT-04:00 2016
Fecha StringBase: 30-05-2016 17:50:37
示例:当 windows 时钟读取 13:00:00 (America/Santiago -4:00) 时执行该操作,但时间戳标记时间为 14:00:00(America/Santiago -3:00) .我取消选中窗口“自动调整夏令时时钟”,由于它不是 DST,Windows 时钟保持不变,我再次执行该操作,时间戳现在读取与 Windows 时钟相同的小时。
我发现了关于时区和该时区 DST 更改的先前问题,但其中大多数是指 2015 年智利没有更改为 DST 的问题。
有什么方法可以在不干预 Windows 机器的情况下解决这个问题?
【问题讨论】:
-
提供您的代码。
-
第一个实例被命名为“calen”,而日期是从“calendar”中读取的。两个实例都可以使用不同的配置。或者您需要更新到真实代码。
-
getInstance 是一个函数调用,我看不到这段代码是如何通过编译器的,忘记了其中固有的运行时错误。
-
我将很快提供测试用例的代码和结果
-
您可以检查“timezone.useDaylightTime()”是否使用 DST。有和没有夏令时的时差是一小时。您可以在 12 月 1 日进行复查。我认为无论有没有夏令时,这两个日期都应该相同。
标签: java date time calendar timezone