2009-02-24 39 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,同意,但唯一的另一種方式,我看到的是保持一個映射。當某人選擇一個沒有映射的時區時會發生什麼?