2009-02-24 40 views
4

我需要添加时区信息到用户维护位置的数据库表。数据将主要从Java代码访问,但也有一些需要了解时区信息的PL/SQL和Win32(Delphi)代码。如何在Windows(非Java)应用程序中使用Java时区ID?

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

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

的问题是:时区IDS似乎并没有与Windows时区兼容D B。例如,java.util.timezone id“Pacific/Marquesas”(-09:30)不在Windows的时区选择列表中。注册局根本没有包含它;见

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

在这里,我只能选择-09:00或-10:00。因此,如果我要像这样存储时区,我如何能够在Windows(无Java)中实现偏移量/ DST信息?希望这不需要映射表,我必须随时更新映射表。是否有一个全球公认的标准比java时区标识更好?

更新

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

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

底线是我需要在当地时间保持DATE值,但我需要知道其中一些TZ的含义。

+0

也许你需要有一个不同的语言/语言环境的Windows像Marquesas是一个有效的选择?毫无疑问,微软不会像这样在这个时区之间传递人们的信息...... – 2009-02-24 19:21:52

+0

它似乎并没有像这样工作。我会说Windows总是拥有注册表中的所有时区(至少支持它)。语言/语言环境无法充分确定时区 - 特别是在今天的移动计算中。 – 2009-02-25 10:25:24

回答

7

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

许多系统使用时区数据的实现Olson。所以这些名字可以在很多系统上运行(大多数Unix,Java,甲骨文我认为)。微软做他们自己的事情。

我在维基百科链接的底部看到有一些对Windows世界的映射的引用。

祝你好运!

+0

好吧,这意味着1.这是一个普遍的问题,2.有一些希望。映射是一种选择,虽然这似乎并不是一门精确的科学,或者我可以使用提供的处理TZ二进制格式的源代码。在这种情况下,我不得不将TZ数据库与应用程序一起部署。 – 2009-02-25 01:19:21

2

我知道这不是最好的办法,但它可能就足够你的情况。不知道所有的要求,我不知道。

你需要什么来使用时区信息?只是为了用正确的偏移量来呈现时间,也许还需要时区的名称?

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

这里假定经常登录的用户是需要完成的用户。如果不是这种情况,您可以运行日常工作来查找Java中每个用户的时区并记录当前有效的偏移量。

Hackish,同意,但唯一的另一种方式,我看到的是保持一个映射。当某人选择一个没有映射的时区时会发生什么?