2012-01-28 43 views
2

時區的變化確實時有發生,我知道英國每年都有人說我們應該取消格林威治標準時間或使用「雙重夏令時」。如何在時區更改後讓TimeZone和日曆保持最新狀態?

發生這些更改時,我猜測通過基於老版本Java的TimeZoneCalendar基類獲得的任何日期都可能會給您提供不正確的數據。無論何時只是更新Java版本,都可以解決這個問題。像一個始終最新的補丁文件,你可以把你的應用程序?

此外,是否可以通過相同的方式解決Applets的問題 - 因爲您不直接控制運行該應用程序的Java版本/更新?

回答

1

最好的解決辦法是升級到最新的JRE和JDK。

如果無論出於何種原因這是不可能的,SUN提供了一個工具來將時區表更新爲最新的工具。你可以找到TZUpdaterhere

-2

java日期讀出系統的時間。這段時間通常與時間服務器同步,所以通常不會有問題。

時區API會爲您計算夏令時。

http://docs.oracle.com/javase/1.4.2/docs/api/java/util/TimeZone.html

+0

但是,TimeZone課程將如何給出正確答案?如果時區有變化,而且它是舊版本的課程,它會不會只是錯誤的? – 2012-01-28 18:07:14

+0

哦,不確定,所以實際上我不想發佈...可能是stackover。爲我做了... – Pieter 2012-01-30 18:26:47

1

了Java TimeZone的派生的SimpleTimeZone類的文檔,並指出...

類持有從偏移格林尼治標準時間,被稱爲原始偏移量,以及夏令時 時間表的開始和結束規則。由於它只爲每個值保存單個值,因此它不能處理從格林尼治標準時間和夏季時間表的偏移量的歷史變化,但setStartYear方法可指定夏令時開始生效的年份。

這意味着如果您的應用程序不依賴於歷史日期/時間,那麼如果您在生成這些對象時使用的TimeZone對象是最新的,則不會有問題。

但是......

如果您的應用程序包含因爲任何形式的歷史日期/時間,那麼當一個新的時區規則生效,你的應用程序將錯誤地解釋您的歷史信息,並顯示不正確的結果數據庫它將使用的TimeZone對象與生成歷史數據時使用的TimeZone對象不同。

如果您保持歷史上準確的日期/時間(例如,對於具有非常明確的計費資格參數明確定義的政府機構的計費記錄),那麼您不僅需要存儲您的歷史數據庫中的日期/時間信息,但也可用於重新創建當時有效的時區規則的信息。有幾種可能的解決方案。

Java的的SimpleTimeZone類有一個構造函數,可以讓你創建一個TimeZone對象與一組的時區和夏令時規則:

的SimpleTimeZone(INT rawOffset,字符串ID,INT startMonth,INT朝九特派,INT startDayOfWeek,INT開始時間, INT endMonth,INT endday指定,INT一個endDayOfWeek,INT結束時間,整數dstSavings)

構造具有給定基準時區與GMT的時差,時區ID,和規則 起動一個SimpleTimeZone並結束夏令時。

因此,只要確保將所有日期/時間信息作爲UTC時間戳存儲在數據庫中。我喜歡將時間戳存儲在數據庫中作爲「修改的Julian日期編號」,它能夠將日曆日期和時間以毫秒的精度存儲在雙精度上。修改的Julian天數總是用UTC來定義的。無論如何,只要你的信息是UTC,你就是標準的。

然後,您可以創建一個表格,其中包含創建數據庫中曾經使用的SimpleTimeZone對象所需的所有參數,或者您可以簡單地使用您喜歡的對象持久性API持久保存數據庫使用的所有對象。使用指示用於相關數據的時區規則的外鍵,可以確保您的數據庫應用程序可以歷史報告準確的當地時間。

相關問題