2011-08-25 23 views
0

我的一臺機器出現了完全奇怪的問題。我編寫了一個監控我們服務器事件的程序,並將它們顯示在監控電腦上。然而,每個事件狀態消息還包含正在由下面的調用中檢索到的時間戳:可疑的JVM時間行爲

Calendar cal = Calendar.getInstance(); 
SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_NOW); 
return sdf.format(cal.getTime()); 

與 公共靜態最終字符串DATE_FORMAT_NOW = 「YYYY-MM-DD HH:MM:SS」;

我期待着這個電話會返回當地時間,這個時間一直很好,直到今天。但現在我的節目向我展示了當地時間+3小時的每一個傳入事件。重新啓動jar文件根本沒有幫助,系統時間也正確設置。該程序運行在一臺正在同步中央企業時鐘的計算機上。

任何人都可以解釋我提到的行爲和/或說明一個可能的解決方案,它不是「重新啓動機器,然後再試一次」:-)?

懸崖: - 時間的Retrival正在我的 - 或任何其他機器上,當我開始計劃 - 目標機運行24/7,是隻有監控機,所以沒有人改變任何選項有 - 直到今天它都能正常工作。 - Hostsystem(Windows XP)上的所有時間/時區設置都正確。 (通過CMD - >「日期」,並通過系統偏好檢查)

我很欣賞這個問題的任何回答。感謝您的時間!


該問題自25日起已回答。我已經實現了Timezone.setDefault()的顯式調用,以確保整個時間顯示正確的時區。我現在要關閉這個問題。

謝謝大家的回答!

+0

你檢查了時區嗎? – THelper

+0

嗨,是的,系統端的所有日期和時間選項都是正確的 – Markus

+0

我的意思是日曆和SimpleDateFormat對象的時區。 – THelper

回答

1

此代碼:

cal.getTime() 

返回Date對象。 A Date對象僅僅是UTC時間的包裝,作爲long。在您向我們展示的代碼中,這是正確的做sdf.format(new Date());

什麼是格式DATE_FORMAT_NOW?我假設你自己指定這個。你是否以這種格式指定時區?

編輯正如您在評論中提到的,DATE_FORMAT_NOW沒有指定時區。您應該同時執行Timezone.getDefault()sdf.getTimezone()以查看該值是否已更改爲您的區域設置+ 3小時。

編輯2我發現this forum post關於時間零星變化。在這種情況下,它是由Oracle驅動程序在方法中調用Timezone.setDefault(...)引起的,然後將其設置回來。

+0

嗨,它是公共靜態final String DATE_FORMAT_NOW =「yyyy-MM-dd HH:mm:ss」; 。那麼上面提到的代碼工作得很好,直到今天。當我在我的或任何其他機器上啓動程序時,它仍然正常工作。正在運行該程序的計算機正在全天候運行。 – Markus

+1

'sdf.getTimeZone()'返回什麼? – Bringer128

+0

嗨,它顯示了一個錯誤的時區,亞洲/卡拉奇。 gettime命令仍然返回錯誤的時間。但系統時間正確設置到當地時間(時區:GMT + 2)。 JVM如何自動更改其時區,更重要的問題是:如何在運行時更改它? – Markus