如何处理Java中缺少的PST小时

时间:2013-05-01 12:36:52

标签: java timezone

我有一个webapp,要部署在具有Pacific TimeZone设置的服务器上。我的应用程序能够在计算中处理PST< - > PDT日期转换,但我正面临处理丢失小时/无效时间的问题,如下所述。

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

因此,每当输入10-Mar-2013 02:00:00之类的日期时,系统会自动将其转换为10-Mar-2013 03:00:00。我知道这种情况正在发生,因为太平洋时区实际上并不存在这段时间。

但是根据要求服务器时区不能更改(例如GMT)并且仍然需要捕获上述时间(10-Mar-2013 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

1 个答案:

答案 0 :(得分:0)

无论计算机的时区设置如何,您都应该始终能够获得当前的UTC时间。 Java从操作系统详细信息中抽象出来,因此只要文档说您获得UTC值(例如UTC时间为1/1/1970的毫秒数),那么它就是准确的。 UTC中没有丢失或模糊的时间。

建议您的服务器设置为UTC时区的原因与系统BIOS时钟与操作系统时钟同步的方式有关。 Microsoft Windows操作系统将BIOS保留在本地时间并根据需要进行调整,而Linux和Macintosh将BIOS永久保留在UTC上。因此,在Windows系统上,如果由于某种原因调整不起作用,则可能无法正确读取时钟。 More on this issue here

如果您的应用程序将输入的日期转换为仅在计算机的本地时区有意义的值,则您已将该时区预测给您的用户。对于桌面应用程序,这可能是正确的,因为用户正在自己的计算机上运行代码。对于Web应用程序(以及其他服务器端代码),这当然是错误的,因为客户端可能与服务器位于不同的时区。

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