2014-09-29 40 views
1

看起來像一個足夠簡單的問題讓我對日期解析很頭痛。用Java中的時區測試日期解析器

在我的java項目中,我有一個自定義日期解析器util類,它處理它可能遇到的所有不同種類的日期字符串格式。

我最近不得不添加下面的用例:

DateFormat fileDateImport = new SimpleDateFormat("EEE, dd MMM yyyy hh:mm:ss zzz");<br /> 
return fileDateImport.parse(stringToParse); 

我現在想測試這一功能,但我一直有,因爲日期不作爲翻譯我期望的問題。我試了幾件事,這裏是我的測試現在的樣子(我的電腦本地設置在CST中)。

Date returnDate = DateParser.parseDate("Wed, 24 Sep 2014 00:00:00 BST"); 
final SimpleDateFormat convertedTime = new SimpleDateFormat("ddMMyyyyhhmmss"); 
convertedTime.setTimeZone(TimeZone.getTimeZone("BST")); 
assertEquals("24092014000000", convertedTime.format(returnDate)); 

returnDate對象顯示「Tue Sep 23 18:00:00 CDT 2014」,這是我所期望的。 CST比BST晚了6個小時。但是,我不想檢查此日期的toString(),因爲此測試可能會在不同的時區運行。

格式的最終​​輸出是「24092014050000」。我不確定它是如何得到這個時間的,它從最初的returnDate開始超過11個小時。

我試過在日曆對象中設置returnDate時間,但我得到了相同的結果。

任何人比我更方便日期比我有任何想法?

+0

如果你能夠使用Java 8中引入一個更好的日期模型,尋找'ZonedDateTime'。同時請記住BST = GMT + 1。 – Caleryn 2014-09-29 14:28:24

+0

這很好理解,但不幸的是我無法控制!我們目前的Java版本是7. – 2014-09-29 14:32:17

+2

不是一個直接的解決方案,但可能更好地使用HH而不是hh。你可能會發現它不是我的下午5點。並嘗試輸出區域(Z)以幫助您瞭解正在發生的事情。 – Caleryn 2014-09-29 14:39:06

回答

2

如果您的意思是英國標準時間(如果您的意思是孟加拉國標準時間,則爲「亞洲/達卡」),您似乎必須使用「歐洲/倫敦」而不是「BST」。

convertedTime.setTimeZone(TimeZone.getTimeZone("Europe/London")); 

http://bugs.java.com/bugdatabase/view_bug.do?bug_id=4257424

+0

感謝喬萬尼,那就是訣竅!這就解釋了11小時的時差,它一定是使用孟加拉國標準時間。 – 2014-09-29 15:43:07

3

如果我明白你的問題,一個解決方法是調用setTimeZone()convertedTimeDateFormat並從fileDateImportDateFormat傳遞的getTimeZone()結果。也就是說,像 -

DateFormat fileDateImport =new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz"); 
try { 
    Date d = fileDateImport.parse("Wed, 24 Sep 2014 00:00:00 BST"); 
    final SimpleDateFormat convertedTime =new SimpleDateFormat("ddMMyyyyHHmmss"); 
    convertedTime.setTimeZone(fileDateImport.getTimeZone()); 
    if ("24092014000000".equals(convertedTime.format(d))) { 
     System.out.println("Passed"); 
    } else { 
     System.out.println("Failed"); 
    } 
} catch (ParseException e) { 
    e.printStackTrace(); 
} 

,因爲它通過單元測試,其輸出Passed。主要區別在於使用解析器中的TimeZone(並使用HH而不是hh數小時)。

+0

-1 OP顯示他正在用期望的時區「BST」調用'setTimeZone'。如上所述,'fileDateInport'的時區是'CST'。 – 2014-09-29 14:45:38

+0

@JohnB除了,如果你運行上面的代碼,它會通過OP發佈的單元測試。請注意,我在格式字符串中使用HH而不是hh。另外,*但是,我不想檢查這個日期的toString(),因爲這個測試可能會運行在不同的時區。* – 2014-09-29 14:46:27

+0

我想你可能是對的,我認爲這個問題可能是' HH'和'hh'。通過使用'hh'而不是解析'am/pm',沒有辦法區分'am'和'pm',所以結果可能很容易被關閉。我只是建議更新你的答案,把重點放在那個上面,而不是用OP設置'timezone'。 – 2014-09-29 14:53:17