如何在Windows(非Java)应用程序中使用Java时区id?

如何在Windows(非Java)应用程序中使用Java时区id?,java,windows,oracle,timezone,Java,Windows,Oracle,Timezone,我需要将时区信息添加到具有用户维护位置的db表中。数据将主要通过Java代码访问,但也有一些PL/SQL和Win32(Delphi)代码需要理解时区信息 使用java.util.TimeZone中的id似乎很简单。Java可以很容易地进行转换(显然),Hibernate内置了对它的支持,而且Oracle显然也了解这些时区ID: select TZ_OFFSET('Pacific/Marquesas') from dual. 问题是:时区ID似乎与Windows时区数据库不兼容。例如,java.

我需要将时区信息添加到具有用户维护位置的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 \软件\Microsoft\Windows NT\CurrentVersion\Time Zones 在这里,我只能选择-09:00或-10:00。那么,如果我像这样存储时区,我如何才能在Windows中获得实际的偏移量/DST信息(没有Java)?希望这不需要一个映射表,每当它发生变化时,我都必须保持最新。是否有一个全球公认的标准比java时区id更有效

更新

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

我意识到时间戳或类似的数据类型比日期更合适。但是,这需要数据迁移(再次需要TZ),并且也处理数据的遗留应用程序不支持这种迁移(除非大量代码被更改)。如果我必须将这些值转换为UTC,则问题几乎相同


底线是我需要将日期值保存在本地时间,但我需要知道其中一些值的含义。

如果不是真正的答案,我可以提供一些背景信息

许多系统使用时区数据的实现。因此,这些名称在许多系统中都适用(我认为大多数是Unix、Java、Oracle)。微软做他们自己的事情

我看到在维基百科链接的底部有一个指向Windows世界的映射


祝你好运

我意识到这不是最好的方法,但对你来说可能已经足够了。不知道所有的要求,我说不出来

您需要使用时区信息做什么?只是用正确的偏移量和时区的名称来表示时间

您可以继续使用Java,通过使用Java查找用户选择的时区来确定用户的偏移量。每次用户登录数据库时,记录当前偏移量。然后其他应用程序可以查看这些信息来确定如何设置时间格式

这假设定期登录的用户是需要进行此操作的用户。如果不是这样,您可以每天运行一个作业,查找Java中每个用户的时区,并记录当前有效的偏移量


Hackish,同意,但我认为唯一的其他方法是维护映射。如果有人选择了一个您没有映射的时区,会发生什么情况?

也许您需要使用不同的语言/区域设置的窗口,才能使Marquesas这样的东西成为一个有效的选择?微软肯定不会像这样在两个时区之间吸引人们……它似乎不是这样工作的。我想说Windows在注册表中总是有所有的时区(至少是它支持的那些时区)。语言/区域设置不能充分确定时区-特别是在今天的移动计算中。好的,这意味着1。这是一个常见的问题和2。还有一些希望。映射是一种选择,尽管这似乎不是一门精确的科学,或者我可以使用提供的处理TZ二进制格式的源代码。在这种情况下,我不得不将TZ数据库与应用程序一起部署。太棒了!我使用这些信息编写了一个.NET扩展函数TimeZoneInfo.OlsonName(),它可以将返回的字符串直接传递给Java。好的,我想我可以在时区发生更改时将Offset/DST等与时区一起存储(更改总是在Java中完成)。听起来确实可行,而且可以避免映射。