2011-05-26 79 views
8

我想從數據庫中提取表並將其重新加載到其他類型的數據庫中。問題在於,在我的本地設置中,日期爲1937年7月1日的00:00:00時出現gettng時間戳的問題。在荷蘭,他們在1937年改變了經脈,導致1937年7月1日的前28秒不存在。Java缺少28秒

當我將日期讀入日曆以重新格式化輸出時,時間會更改爲日期前的28秒; 6月30日23:59:32或7月1日00:00:28(取決於驅動程序) 任何人都知道解決此問題的解決方法?

http://themagicofscience.blogspot.com/2010/08/java-puzzler-1-july-1937.html

+0

目前尚不清楚輸入和輸出在這裏。你可以發佈一些代碼嗎? – 2011-05-26 14:57:47

+1

你認爲有效的輸出是什麼?另外,您是否需要本地化時間,或者您可以使用UTC嗎? – atk 2011-05-26 15:02:54

+1

一般而言,如果您需要這種準確度,現代通用時間系統將不夠用。它們通常使用所謂的「預先格雷戈裏歷」,它將當前規則向後應用。這需要一個非常專業的系統來處理這些問題。當時間偏離格林威治標準時間(UTC僅在1972年開始)時,有些國家(我似乎記得荷蘭是其中之一)的時間已經包含在一秒之內。這將在20世紀初。 – 2011-05-26 15:21:15

回答

3

配置您的Calendar以使用不同的Locale

Calendar■將編碼時間轉換爲當地時間。那些20+秒在Locale中並不存在不同的顯示格式,所以如果你堅持保留這個Locale,並且你堅持要顯示日期和時間,那麼你需要在1937年與荷蘭政府接手;但是,如果將顯示格式更改爲其他Locale的顯示格式,則會發現基礎時間數據結構的實際值未發生更改,它將在具有不同秒數值的區域設置中顯示不同時間。

唯一的告誡是,應該怎麼操作讀它並將其存儲之間的時間,那麼你可能會無意中創建一個新的TimeCalendar對象,這將設置或重置基礎上,Locale格式化的翻譯它的基礎數據結構時間轉換爲底層數據表示。

這就是爲什麼最好使用UTC處理批量日期和時間處理,而不需要夏令時。即使時間與當地時間不匹配(並且不同時區的人難以閱讀),UTC的每秒都會存在,因此可以通過簡單格式化受影響的人來快速驗證簡單的+5秒更改時間。

唯一需要注意的是,以後您必須始終將UTC時間翻譯回當地時間進行顯示。根據你的聽衆的教育情況,一些荷蘭人可能會驚訝地發現他們的政府不允許這樣的秒數存在,並可能要求他們被顯示,儘管裁決說這些秒不是荷蘭日曆的一部分。

只是等待,直到你發現丟失的天回1582年

+0

在UTC中操作似乎是對我來說最好的解決方案。但是,其他時區是否也會帶來相同的問題,可能採用稍微不同的方式? – ferdyh 2011-05-26 21:15:14

+0

這不是真正的時區問題,它是與時區相結合的區域設置。其他地區也存在問題(很少),但它們在細節方面往往很不相同,儘管類似的事實是政府的行動決定需要進行一些調整以使日曆與期望的目標保持一致。 – 2011-05-26 21:57:29

+0

是不是有某種完全忽略語言環境的日曆對象? – ferdyh 2011-05-27 06:42:44

0

最簡單的很可能是做對那些特定的時間簡單的檢查,並相應地更改日期。

0

嘗試並提取GMT或UTC日期,然後加載它們放回的方式。然後,您將使用新系統的詳細信息作爲區域設置,而不是原始系統。

1

在Java中,日期以獨立於時區的方式內部存儲。 (它的存儲時間爲毫秒數 - 我忘記了開始日期,是格林威治標準時間1970年1月1日?)輸出日期時,那麼必須考慮時區。但是任何內部操縱都不應該成問題。你沒有說你使用的是什麼數據庫引擎,所以我不知道它是如何存儲日期的。我現在主要使用Postgres,它將所有日期存儲在GMT中,並在輸入和輸出時間轉換到適當的時區並從中轉換。

因此,如果您只是將時區設置爲GMT,那麼移動時區邊界,夏令時等的任何更改都應該是不相關的。

+0

僅供參考,使用32位有符號時間(秒)範圍從1901-12-13到2038-01-19。如果您有其他選擇,例如64位毫秒,用它代替。 – karmakaze 2011-05-26 17:13:22

+0

我剛剛檢查了他的源代碼:Java Date類將時間存儲爲自1970年1月1日以來的一個長整數(64位)毫秒數。它應該能夠處理......快速計算......跨度大約2.92億年辦法。 Sun和甲骨文沒有冒犯,但我猜測Java在2.9億年後可能還不會被使用。我將開始擔心在大約2.8億年內向更大的日期字段過渡戰略。這應該有足夠的時間來規劃和實施它。 – Jay 2011-05-27 17:30:40

+0

但是,嚴肅的人,任何在這個時代創造時間類型的人,至少應該能夠覆蓋140億年,回到大爆炸中,並且至少有這麼多,或者更多...... – karmakaze 2011-05-27 19:10:03