2015-12-21 124 views
0

我試圖解析包含一個DateTime不是從喬達日期時間

def parseDateTime(str : String) : DateTime = { 
    //need to parse date time of this format 
    //2015-05-22T05:10:00.305308666Z 

    DateTime.parse(str,DateTimeFormat.forPattern(dateTimePattern)) 
    } 

    def dateTimePattern = "yyyy-MM-dd'T'HH:mm:ss.SSSSSSSSSZ" 

這裏串解析一個小時是我測試的情況下試圖解析日期時間

"MarshallerUtil" must "parse a date time correctly from blockcypher" in { 
    val str = "2015-05-22T05:10:00.305308666Z" 
    val dateTime = parseDateTime(str) 
    dateTime.getYear must be (2015) 
    dateTime.getMonthOfYear must be (DateTimeConstants.MAY) 
    dateTime.getDayOfMonth must be (22) 
    dateTime.getHourOfDay must be (5) 
    dateTime.getMinuteOfHour must be (10) 
    } 

和它沒有得到正確的小時

[info] - must parse a date time correctly from blockcypher *** FAILED *** 
[info] 0 was not equal to 5 (MarshallerUtilTest.scala:17) 

我的模式有什麼不正確?

+1

首先,你應該把Z放在撇號內。 「yyyy-MM-dd'T'HH:mm:ss.SSSSSSSSS'Z'」 – znurgl

+0

** Z **用於日期時間格式的時區,其中as ** T **用作日期之間的分隔符和時間。雖然上面解決了你的問題,但你應該注意到** Z **是用於時區的,你應該確保你不會錯誤地解析日期字符串。 – James

+0

@JavaAnto對不起,我刪除了我的評論,因爲我想我遇到了你正在談論的確切問題。另一個測試案例沒有說'...「5-05-22T05:10:00.305 [-05:00]」不等於「... 5-05-22T05:10:00.305 [308666Z]」「' –

回答

1

這是因爲它將日期時間解析爲UTC,並且當您調用getHourOfDay時,它會返回具有本地時區的時間單位。例如,同一個程序在此打印'10',因爲我的本地時區是'+05:30',所以05:10和05:30是10:40。我希望這有幫助。

更新:

Ž是一個佔位符/匹配器,其在所述日期時間圖案用於匹配的時區。時區格式爲'+ HH:mm'或'-HH:mm',例如'+05:30'表示時區爲UTC時間前5小時30分鐘。

+0

更新1是錯誤的。日期時間字符串中的'Z' _is_時區:請參閱https://www.ietf.org/rfc/rfc3339.txt和http://www.timeanddate.com/time/zones/z(加+05: 30'是一個偏移量,而不是一個時區:由於夏令時和規則的變化,一個時區有不同的偏移量)。 –

+0

謝謝,我刪除了誤導性更新。 – James