我需要将时区信息添加到具有用户维护位置的数据库表中。数据将主要从 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 意味着什么。