2014-01-13 41 views
3

我在解析時間瞬間發現JodaTime中的某種不當行爲。Joda期間不是打印日

DateTimeFormatter dateStringFormat = 
       DateTimeFormat.forPattern("EEE MMM dd kk:mm:ss 'GMT'Z yyyy"); 
     DateTime startTime = dateStringFormat.withOffsetParsed(). 
       parseDateTime("Tue Jan 01 09:30:00 GMT+2000 2013"); 
     DateTime endTime = dateStringFormat.withOffsetParsed(). 
       parseDateTime("Tue Jan 05 10:31:00 GMT+2000 2013"); 


     Period period = new Period(startTime, endTime); 

     PeriodFormatter formatter = new PeriodFormatterBuilder().appendDays() 
       .appendSuffix(" day ", " days") 
       .appendHours() 
       .appendSuffix(" hour ", " hours") 
       .appendMinutes() 
       .appendSuffix(" minute", " minutes") 
       .toFormatter(); 


     System.out.println(formatter.print(period)); 

輸出爲: 「1小時經濟了1分鐘」
哪裏是 「天」 的一部分?


羅勒布爾克的版本代碼...

一天的日莫名其妙地被解析爲01,而不是05年第二日期時間。

DateTimeFormatter dateStringFormat = DateTimeFormat.forPattern("EEE MMM dd kk:mm:ss 'GMT'Z yyyy"); 
DateTime startTime = dateStringFormat.withOffsetParsed().parseDateTime("Tue Jan 01 09:30:00 GMT+2000 2013"); 
DateTime endTime = dateStringFormat.withOffsetParsed().parseDateTime("Tue Jan 05 10:31:00 GMT+2000 2013"); 

轉儲到控制檯...

System.out.println("startTime: " + startTime); 
System.out.println("endTime: " + endTime); 

運行時...

startTime: 2013-01-01T09:30:00.000+20:00 
endTime: 2013-01-01T10:31:00.000+20:00 
+0

我已確認的問題。但是您可以從示例代碼的後半部分中刪除所有的Period和「formatter」代碼。問題出現在解析中,兩個DateTime實例中的日期都是01,但第二個DateTime應該是05.我會將更簡單的代碼粘貼到您的問題中。如果你願意,你可以刪除或編輯。 –

+2

我可以確認這兩個答案[由LaurentG](http://stackoverflow.com/a/21088329/642706)和[由PopoFibo](http://stackoverflow.com/a/21088302/642706)是正確的。在第二個DateTime中將「Tue」更改爲「Sat」可修復問題。那個日期格式很討厭!堅持[ISO 8601](http://en.wikipedia。org/wiki/ISO_8601)標準格式:'2013-01-05T10:31:00 + 20:00' –

回答

3

日期都給出週二。如果您糾正這一點,並設定2013年1月5日爲星期六(因爲它),那麼它的工作原理:

DateTime startTime = dateStringFormat.withOffsetParsed().parseDateTime("Tue Jan 01 09:30:00 GMT+2000 2013"); 
DateTime endTime = dateStringFormat.withOffsetParsed().parseDateTime("Sat Jan 05 10:31:00 GMT+2000 2013"); 

它看起來像有沒有辦法檢查日期與喬達時間有效:

+0

明白了,非常感謝 –

2

發生這種情況,因爲在這種情況下,endTime代表着不正確的日期 - 這意味着Jan 05 2013不是週二但實際上是週六

這工作:

DateTimeFormatter dateStringFormat = DateTimeFormat.forPattern("EEE MMM dd kk:mm:ss 'GMT'Z yyyy"); 
DateTime startTime = dateStringFormat.withOffsetParsed().parseDateTime("Tue Jan 01 09:30:00 GMT+2000 2013"); 
DateTime endTime = dateStringFormat.withOffsetParsed().parseDateTime("Sat Jan 05 10:31:00 GMT+2000 2013"); 

System.out.println(dateStringFormat.print(startTime)); 
System.out.println(dateStringFormat.print(endTime)); 

輸出:

Tue Jan 01 09:30:00 GMT+2000 2013 
Sat Jan 05 10:31:00 GMT+2000 2013 

看起來喬達時間使用一天解析。格式化模式內的切換TuesdaySaturday翻轉日期Jan 05不分先後順序的

DateTimeFormatter dateStringFormat = DateTimeFormat.forPattern("MMM dd EEE kk:mm:ss 'GMT'Z yyyy"); 
DateTime endTime = dateStringFormat.withOffsetParsed().parseDateTime("Jan 01 Sat 10:31:00 GMT+2000 2013"); 
DateTime startTime = dateStringFormat.withOffsetParsed().parseDateTime("Jan 01 Tue 09:30:00 GMT+2000 2013"); 

輸出:

Jan 01 Tue 09:30:00 GMT+2000 2013 
Jan 05 Sat 10:31:00 GMT+2000 2013