2011-01-14 34 views
0

我希望以下解釋能夠有意義,因爲這是一個我們正面臨並且難以描述的奇怪問題。hudson或jodatime的偶爾日期或時區差異

我們有一個maven項目,它在哈德森建立,幷包含一些單元測試日期使用和聲明。哈德遜服務器在solaris上運行。現在,偶爾(如30%的時間)使用日期進行單元測試失敗,因爲在單元測試中從指定的時間中扣除3,5小時,因此斷定啓動失敗。其他70%一切正常,儘管代碼中沒有任何變化,我們每小時運行hudson幾次。

我下面的代碼添加到一個單元測試來檢查時間:

@Test 
public void testDate() { 
    System.out.println("new DateMidnight(2011, 1, 5).toDate();"); 
    System.out.println(new DateMidnight(2011, 1, 5).toDate()); 
    System.out.println(new DateMidnight(2011, 1, 5).toDate().getTime()); 

    Calendar cal = Calendar.getInstance(); 
    cal.set(Calendar.YEAR, 2011); 
    cal.set(Calendar.MONTH, 0); 
    cal.set(Calendar.DAY_OF_MONTH, 5); 
    cal.set(Calendar.HOUR, 0); 
    cal.set(Calendar.MINUTE, 0); 
    cal.set(Calendar.SECOND, 0); 
    cal.set(Calendar.MILLISECOND, 0); 
    System.out.println("cal.getTime();"); 
    System.out.println(cal.getTime()); 
    System.out.println(cal.getTime().getTime()); 
} 

所以基本上應該使用jodatime或普通的舊日曆打印時,同樣的事情。 70%的運行情況就是如此;對於其他30%我獲得以下的打印輸出:

Running TestSuite 
new DateMidnight(2011, 1, 5).toDate(); 
Tue Jan 04 21:30:00 MET 2011 
1294173000000 
cal.getTime(); 
Wed Jan 05 12:00:00 MET 2011 
1294225200000 

因此,日曆保持正確的日期和時間,但jodatime扣除3.5個小時。

本地maven測試永遠不會出現這個問題,我們無法弄清楚它可能是什麼原因。特別是,我們不能想到測試有時會通過的一個單一原因,有時會在不更改任何代碼或哈德森或服務器設置的情況下失敗。

另外,我們用cobertura運行maven install,這意味着單元測試運行兩次。它也發生了,他們第一次通過,第二次失敗或者其他方式失敗,或者兩次失敗。

感謝您的任何解決方案或提示,以追查原因,
斯泰恩

回答

0

這個問題現在似乎已經解決了。

我們已將我們的jodatime版本從5.14.2升級到5.14.6。 從那時起,我每半個小時就在auto上運行一次,所以在大約100次運行之後,我們再也沒遇到過這個問題。

0

也許哈德森是在3臺服務器上運行,並且1具有與其他2不同版本的JDK時區的數據? (詳細檢查JVM版本)。請記住,Joda-Time也有自己版本的時區數據,而這兩者可能會有所不同。

1

您也可能遇到SUREFIRE-533的某個版本,應該可以通過在運行hudson的環境中設置TZ環境變量來解決此問題。如果這有幫助,請報告問題。