1

我有一个要部署在具有太平洋时区设置的服务器上的 web 应用程序。我的应用程序能够在计算中处理 PST<->PDT 日期转换,但我在处理缺失小时/无效时间时遇到问题,如下所述。

无效时间 - 由于时钟的向前自动调整,在 3 月的第二个星期日凌晨 02:00 至凌晨 03:00 之间,太平洋时区不存在此时间。

因此,每当输入像 2013 年 3 月 10 日 02:00:00 这样的日期时,系统会自动将其转换为 2013 年 3 月 10 日 03:00:00。我理解这种情况正在发生,因为太平洋时区实际上不存在这个时间。

但根据要求,服务器时区不能更改(例如格林威治标准时间),仍然需要捕获上述时间(2013 年 3 月 10 日 02:00:00)。此外,服务器自动调整时钟设置也无法更改,因此我必须更改应用程序代码以支持上述。

在此先感谢您的帮助。

添加代码以进行更多说明:

SimpleDateFormat sdf = new SimpleDateFormat("ddMMyy HH:mm:ss");
//sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
Date date = sdf.parse("100313 02:00:00");
Date date1 = sdf.parse("100313 03:00:00");
System.out.println(sdf.format(date));
System.out.println(sdf.format(date1));

Output:
100313 03:00:00
100313 03:00:00

If i uncomment commented line then output:
100313 02:00:00
100313 03:00:00
4

1 回答 1

0

无论计算机的时区设置如何,您都应该始终能够获得当前的 UTC 时间。Java 从操作系统细节中抽象出来,所以只要文档说你得到一个 UTC 值(例如从 1970 年 1 月 1 日 UTC 开始的毫秒数),那么它就是准确的。UTC 中没有丢失或不明确的时间。

建议将服务器设置为 UTC 时区的原因与系统 bios 时钟与操作系统时钟同步的方式有关。Microsoft Windows 操作系统将 bios 保持在本地时间并根据需要进行调整,而 Linux 和 Macintosh 将 bios 永久保持在 UTC。因此,在 Windows 系统上,如果由于某种原因无法进行调整,则时钟读取错误的可能性很小。 更多关于这个问题的信息

如果您的应用程序正在将输入的日期转换为仅在计算机本地时区有意义的值,那么您已将该时区投射到您的用户。对于桌面应用程序,这可能是正确的,因为用户正在他们自己的计算机上运行代码。对于 Web 应用程序(和其他服务器端代码),这肯定是错误的做法,因为客户端可能与服务器处于不同的时区。

请更新您的问题以显示您的应用程序中导致您描述的问题的特定代码。然后,我们可以指出您需要进行的特定更改,以便您的应用程序正常运行。

于 2013-05-01T14:41:30.580 回答