4

我需要将时区信息添加到具有用户维护位置的数据库表中。数据将主要从 Java 代码访问,但也有一些 PL/SQL 和 Win32 (Delphi) 代码需要了解时区信息。

使用 java.util.TimeZone 中的 id 似乎很简单。Java 可以很容易地转换它(显然),Hibernate 内置了对它的支持,而且显然 Oracle 也理解这些时区 ID:

select TZ_OFFSET('Pacific/Marquesas') from dual.

问题是:时区 ID 似乎与 Windows 时区数据库不兼容。例如,java.util.timezone id "Pacific/Marquesas" (-09:30) 不在 Windows 的时区选项列表中。注册表根本不包含它;看

\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones

在这里,我只能选择 -09:00 或 -10:00。那么,如果我要像这样存储时区,我怎样才能获得 Windows 中的实际偏移/DST 信息(没有 Java)?希望这不需要一个映射表,每当它发生变化时我都必须保持最新。是否有比 java 时区 id 更好的全球公认标准?

更新

时区信息与数据库上的 DATE 列结合使用。这些列包含本地日期/时间值。如果某个位置可以与这些值相关联,则该位置的时区使我能够在需要时将日期/时间值转换为 UTC 或任何其他时区。

我意识到代替 DATE TIMESTAMP_TZ 数据类型或类似的东西会更合适。但是,这将需要数据迁移(为此再次需要 TZ),并且也适用于数据的遗留应用程序不支持(除非更改了大量代码)。如果我必须将值转换为 UTC,问题几乎相同。

底线是我需要将 DATE 值保留在本地时间,但我需要知道其中一些 TZ 意味着什么。

4

2 回答 2

6

如果不是真正的答案,我可以提供一点背景。

许多系统使用时区数据的Olson实现。所以这些名字适用于许多系统(我认为大多数 Unix、Java、Oracle)。微软做自己的事情。

我在该 Wikipedia 链接的底部看到了对 Windows 世界的一些映射的引用。

祝你好运!

于 2009-02-24T19:22:33.053 回答
2

我意识到这不是最好的方法,但在你的情况下可能就足够了。在不知道所有要求的情况下,我无法分辨。

您需要使用时区信息做什么?只是用正确的偏移量显示时间,也许还有时区的名称?

您可以继续使用 Java 来确定用户的偏移量,方法是使用 Java 查找用户选择的时区。每次用户登录时,都会在您的数据库中记录当前的偏移量。然后其他应用程序可以查看此信息以确定如何格式化时间。

这假设定期登录的用户是需要这样做的用户。如果不是这种情况,您可以运行每日作业以在 Java 中查找每个用户的时区并记录当前有效的偏移量。

Hackish,同意,但我看到的唯一其他方法是维护映射。当有人选择您没有映射的时区时会发生什么?

于 2009-02-24T20:09:38.743 回答