2009-01-25 86 views
6

我們正在處理大量數據,所有數據都以UTC標記(以Java表示)。在讀取這些數據之間,將其存儲在數據庫中並再次將其發佈出去,結果發生了一些數據在夏令時期間關閉了一個小時的情況。由於UTC沒有夏令時的概念,這顯然是軟件中的一個錯誤。一旦知道,它很容易修復。然而,不管當前時間差如何,都可以使用一些單元/集成測試 - 例如,我想更改本地時區並在這些不同的時區內反覆運行一些方法,以確保UTC正確處理。測試正確的時區處理

由於測試應該自動運行,並且 - 最好 - 在一個TestSuite中,我想知道如何最好地測試正確的行爲。在重啓JVM時很容易改變像時區這樣的本地設置,但在測試套件中運行並不那麼容易。

有沒有人知道支持這種情況的測試環境,庫或模式?我們通常使用JUnit,但是如果它有助於擺脫這樣的問題,則可以添加其他環境/技術。我想這是一個整合而不是單元測試。

編輯:已經有兩個非常有用的答案,但我想必須有更多的技術。有沒有人有關於何時/經常調用TimeZone.getDefault的權威信息(請參閱Jon Skeets答案的評論)?

注意:即使這個問題有一個公認的答案,我不完全確定,接受哪個答案。即使有了這種接受,我希望看到更多的想法和技巧。

感謝您的輸入!

+1

想了解更多的想法和技巧,你可以查看關於Java時區警告的個人文章:http://tshikatshikaaa.blogspot.nl/2012/09/about-java-timezone-and-calendar-caveats.html。要獲得每個時區周圍世界的當前時間,請查看:http://yourworldclocks.juplo.com/希望這有助於您! – JVerstry 2013-01-26 12:58:00

回答

6

我建議你檢查一下JodaTime,它提供了一些糖來幫助管理日期/時間/ TimeZone類型的問題,在你的代碼中更清晰。

我們在整個測試和生產過程中使用它們,因爲它如何爲日期/時間問題提升本地Java API是無與倫比的。在JUnit中使用這些測試工作正常

7

Java允許您設置默認時區(java.util.TimeZone.setDefault)。我之前已經編寫過測試,將時區設置爲各種不同的選項,並檢查一切仍然有效。但是要小心 - 如果你將大部分的單元測試並行化,那麼你需要順序完成這些測試。

我建議你在夏令時適用的某些時區測試適用,有些不適用。使用澳大利亞時區也很好,因爲DST適用於一年中北半球的相反時間。

+1

謝謝。我不知道是否可以信任一次又一次地更改默認值,或者在VM的生命週期中讀取默認時區時。你會說我可以嗎?我在時區找到的文檔沒有包含太多的信息。 Javadoc在這方面幾乎沒有任何信息...... – 2009-01-25 18:02:06

+0

這取決於什麼是抓取默認時區。有些東西可能會緩存,但我懷疑大多數情況下每次都會調用getDefault。 – 2009-01-25 18:05:38

+0

謝謝 - 我總是懷疑最糟糕的,特別是當我試圖依靠自動測試的結果時。也許我應該在這種情況下更樂觀...... – 2009-01-26 08:34:14

1

關於連接到時間服務器和獲取更新有什麼意見?