【问题标题】:How to handle missing PST hour in Java如何在 Java 中处理缺少的 PST 小时
【发布时间】:2013-05-01 12:36:51
【问题描述】:

我有一个 webapp 将部署在具有太平洋时区设置的服务器上。我的应用程序能够在计算中处理 PSTPDT 日期转换,但我面临处理缺失小时/无效时间的问题,如下所述。

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

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

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

【问题讨论】:

  • 为什么?您可以在进入系统之前将“10-Mar-2013 02:00:00”作为GMT时间传递或作为字符串参数传递并在输入后转换为Date对象?
  • 我收到来自休眠本地查询的日期,没有选项将其作为 GMT 传递。
  • 你说这是一个网络应用?您是在 JSP 页面中运行它吗?日期起源于哪里,它们代表什么?你说用户正在输入它们 - 你的意思是在网络浏览器中?你可以在那里使用 JavaScript 吗?它们是否代表用户的本地时区,可能与服务器时区不同,你关心吗?

标签: java timezone


【解决方案1】:

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

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

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

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

【讨论】:

  • “UTC 中没有丢失或不明确的时间。”除了闰秒。 :D
  • “如果您的应用程序将输入的日期转换为仅在计算机本地时区有意义的值,那么您已将该时区投射到您的用户。”日期值在任何时区都有意义,因为它们完全独立于 TZ; TZ 仅在将该值从/转换为人类可读格式时使用。如果服务器在转换输入的日期时假定 TZ,并且输入的日期未在该 TZ 中表示,则解析的值是错误的。如果您从任何其他来源(如系统时间)获取日期值,应用程序将正常运行。
  • @AlvinThompson - 我说的是一般的日期/时间。您是正确的,Java Date 类代表 UTC 并且所有值都是可以接受的。关于闰秒的好点,但它们几乎总是可以被忽略。
  • 更正:如果您从任何其他来源(如系统时间)获取日期值,应用程序将正常运行。
  • 我在帖子中添加了代码以进一步澄清问题,请注意代码是在设置为 PST 时区的系统下执行的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-11
  • 2020-01-08
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 2016-10-27
  • 2011-12-28
相关资源
最近更新 更多