2016-03-02 110 views
0
時區的日期字符串

我有下面的代碼分析出從給定日期字符串ZonedDateTime對象中,輸入字符串的格式如下:轉換與指定GMT

"Thu, 03 Mar 2016 02:42:00 +1000 (AEST)"

我的解析代碼像這樣:

public ZonedDateTime parseDate(String dateString) throws Exception { 
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("ccc, dd MMM yyyy HH:mm:ss Z (z)"); 
    ZonedDateTime dateTime = ZonedDateTime.parse(dateString, formatter); 
    ZoneId gmt = ZoneId.of("GMT"); 
    ZonedDateTime dateTimeInGMT = dateTime.withZoneSameInstant(gmt); 
    return dateTimeInGMT; 
} 

,我有這樣的單元測試:

@Test 
public void shouldParseTimezone() throws Exception { 
    MailFileParserJava parser = new MailFileParserJava(); 
    String aestDateTime = "Thu, 03 Mar 2016 02:42:00 +1000 (AEST)"; 
    ZonedDateTime aestZone = parser.parseDate(aestDateTime); 
    assertThat(aestZone.getDayOfMonth(), is(2)); 
    assertThat(aestZone.getHour(), is(16)); 
} 

但我的單元測試失敗的getHour()斷言 -

Expected: is <16> 
    but: was <15> 

我不明白是怎麼回事錯的,如果我有時間上午02時42分,我減去+10小時的偏差,那麼我應該得到4:42 pm的結果(即小時是16)。

我將字符串轉換爲ZonedDateTime或其他代碼錯誤的方式有問題嗎?

編輯:

好了,它看起來像時區轉換的東西我做忽略時間段偏移我通過,並考慮到實際的時區指定日期(即現在是白天在澳大利亞東部節省,所以真正的抵消是+1100而不是+1000)。

現在我的問題是,我如何讓Java接受我傳遞它的偏移量,而不是使用它自己的一組時區規則來執行轉換?

+1

Your aestDateTime日期字符串錯誤。刪除'Date:'前綴。 – Andreas

+0

對不起,這應該不會出現,我仍然有同樣的問題 – jcm

+0

*「我如何讓Java接受偏移量我傳遞它」* @Lashane已經告訴你:**刪除符號時區名稱(AEST)** – Andreas

回答

1

AEST時區11小時現在(DST),所以串+1000基本上忽略-11小時偏移應用於

您可以從測試中去掉符號區名稱(AEST),並只在接力+1000或調整測試

0

AESTAustralia/Sydney,其觀察夏令時,以及2016年,DST 04月03日結束,10月2

再次啓動這意味着03 Mar 2016是DST,這是+1100,而不是+1000

ZonedDateTime.parse回報:

2016-03-03T02:42+11:00[Australia/Sydney] 

轉換爲格林尼治標準時間爲您提供:

2016-03-02T15:42Z[GMT] 

調試您的代碼會顯示你這一點。我剛剛爲dateTimedateTimeInGMT添加了打印語句以查看它。