2015-12-21 3 views
0

Я пытаюсь разобрать строку, содержащую ЗаданНе разборе час от Joda 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 ** используется для часового пояса в формате даты, где ** ** используется как разделитель между датой и время. Хотя выше решается ваша проблема, вы должны заметить, что ** 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. Надеюсь, это поможет.

Обновление:

Z является заполнитель/согласованью, который используется в шаблоне времени даты, чтобы соответствовать часовому поясу. Часовой пояс имеет форму «+ HH: mm» или «-HH: mm», например «+05: 30» означает, что часовой пояс составляет 5 часов и 30 минут до времени UTC.

+0

Обновление 1 неверно. 'Z' в строке datetime _is_ часовой пояс: см. Https://www.ietf.org/rfc/rfc3339.txt и http://www.timeanddate.com/time/zones/z (плюс,' +05: 30' является смещением, а не часовым поясом: один часовой пояс имеет разные смещения с течением времени из-за перехода на летнее время и изменения правил). –

+0

Спасибо, я удалил вводящее в заблуждение обновление. – James

Смежные вопросы