2015-12-21 125 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