我需要将时区信息添加到具有用户维护位置的db表中.数据将主要从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意味着什么.
如果不是真正的答案,我可以提供一些背景知识.
许多系统使用Olson实现的时区数据.所以这些名称在很多系统中都有用(我认为大多数是Unix,Java,Oracle).微软做了自己的事情.
我在Wikipedia链接的底部看到有一些对Windows世界的映射的引用.
祝好运!