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

标签 java timezone

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

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

因此,每当输入像 10-Mar-2013 02:00:00 这样的日期时,系统都会自动将其转换为 10-Mar-2013 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

最佳答案

无论计算机的时区设置如何,您都应该始终能够获取当前的 UTC 时间。 Java 从操作系统详细信息中抽象了这一点,因此只要文档说您获得 UTC 值(例如 1970 年 1 月 1 日 UTC 的毫秒数),那么它就是准确的。 UTC 时间不存在缺失或不明确的情况。

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

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

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

关于java - 如何处理 Java 中缺少的 PST 小时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16318201/

相关文章:

java - 使用 Comparator.comparing 对字符串格式的 float / double 列表进行排序

java - CrudRepository.save(Iterable<S>) 是原子的吗?

javascript - 时区转换

c# - 我可以将对 System.Core.dll (.net 3.5) 的引用添加到 .net 2.0 应用程序并使用它吗

java - 在改造库中禁用 SSL 证书检查

java - Jsoup Html解析查询

java - 如何将数据透视查询的用户定义变量(@sql)获取到java的结果集

.net - 如何: get time zones in .网络框架2.0

sql-server - 如何在 SQL Server 2005 中存储时区

将 GMT 转换为相差一年的本地结果