2014-10-15 2 views
-1

Я ожидаю, что тест ниже пройдет. Может ли кто-нибудь сказать мне, что я делаю неправильно здесь? Скорее всего, я использую неправильный шаблон, но я не вижу, что не так.Что я делаю неправильно при разборе даты ISO8601?

@Test 
public void parseDateTest() { 
    DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.sss'Z'"); 
    DateTime dt = formatter.parseDateTime("1983-03-06T05:00:03.000Z"); 
    assertEquals("1983-03-06T05:00:03.000Z", dt.toString()); 
} 

FYI dt.toString() делает печать: 1983-03-06T05: 00: 00.000Z

Спасибо!

P.S. Обратите внимание: в этом фрагменте я полагаюсь на часовой пояс по умолчанию. Это не производственный код, и как правильно обрабатывать часовой пояс, основанный на потребностях, покрывается многими другими вопросами.

Часовой пояс по умолчанию определяется системным свойством user.timezone. Если это значение null или не является допустимым идентификатором, тогда значение JDK TimeZone по умолчанию преобразуется. Если это не удается, используется UTC.

+0

FYI Я использую Joda DateTime в этом фрагменте. –

+0

Вместо того, чтобы добавлять дополнительную информацию в качестве комментариев, отредактируйте вопрос. Если вы используете веб-браузер, найдите ссылку «изменить» ниже Вопроса, влево-влево. –

+0

Кстати, нет необходимости в форматировании. Формат по умолчанию для метода 'toString' в' DateTime' является стандартным форматом [ISO 8601] (http://en.wikipedia.org/wiki/ISO_8601) в этом Вопросе: 'yyyy-MM-ddTHH: mm : ss.SSSZZ'. Передайте строку конструктору DateTime: 'new DateTime (" 1983-03-06T05: 00: 03.000Z ")'. Я бы также передал желаемый часовой пояс для назначения, а не полагаться неявно на текущий часовой пояс JVM: 'new DateTime (« 1983-03-06T05: 00: 03.000Z », DateTimeZone.forID (« Европа/Лондон »))' , –

ответ

4

Это проверяет, соответствует ли "1983-03-06T05:00:03.000Z" значение dt.toString(). Вы говорите, что dt.toString() равно "1983-03-06T05:00:00.000Z".

"1983-03-06T05:00:03.000Z" !== "1983-03-06T05:00:00.000Z" 

Теперь проблема почему dt.toString() не имеет правильное количество секунд. Давайте посмотрим на ваш DateTimeFormat схемы:

"yyyy-MM-dd'T'HH:mm:ss.sss'Z'" 

According to the docs, s для «второго» и минут S для «фракции второго» (обратите внимание на регистр). Это означает, что в вашей строке ввода, как 03, так и 000 анализируются как секунды (когда позже должны быть доли), а ваши DateTime секунд забрасываются 00. Попробуйте обновить эту строку формата:

@Test 
public void parseDateTest() { 
    DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); 
    DateTime dt = formatter.parseDateTime("1983-03-06T05:00:03.000Z"); 
    assertEquals("1983-03-06T05:00:03.000Z", dt.toString()); 
} 
+0

Я предположил, что факт, что «1983-03-06T05: 00: 03.000Z» должен быть равен ds.String(), был понят контекстом, но спасибо за ваше разъяснение. В любом случае, ваш ответ правильный! –

+0

@ChristianSisti Я предположил, что вы знали, но не был полностью уверен, поэтому подумал, что это поможет. Glad 'SSS' решил проблему :) – Sam

0

Не используйте dt.toString(), используйте formatter.format(dt) вместо этого. Вот что такое форматирование:

@Test 
public void parseDateTest() { 
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); 
    LocalDateTime dt = formatter.parse("1983-03-06T05:00:03.000Z", LocalDateTime::from); 
    assertEquals("1983-03-06T05:00:03.000Z", formatter.format(dt)); 
} 
+0

Спасибо, но это работает с Java8, я думаю? Да, я мог бы передать formatter методам toString dt.toString (formatter), но это в любом случае поведение по умолчанию Joda .toString(). В любом случае вы заставляете меня замечать, что я не уточнил, что использовал Joda, обновит вопрос. –

+0

Я видел Joda, но слишком поздно, и предполагая, что функциональность была идентична Java 8, все равно отправил ответ. Интересно, что поведение по умолчанию LocalDateTime dt.toString в Java 8 - '1983-03-06T05: 00: 03'. Я тоже не знал об этой разнице. – wallenborn

+0

Чтобы уточнить формат по умолчанию, используемый [Joda-Time] (http://www.joda.org/joda-time/) ['DateTime'] (http://www.joda.org/joda-time /apidocs/org/joda/time/DateTime.html) реализация 'toString' является стандартным форматом [ISO 8601] (http://en.wikipedia.org/wiki/ISO_8601):' yyyy-MM-ddTHH: mm : ss.SSSZZ' per [doc] (http://www.joda.org/joda-time/apidocs/org/joda/time/base/AbstractDateTime.html#toString()). Таким образом, этот ответ неверен или вводит в заблуждение, так как в этом случае нет причин беспокоиться о форматировании. –

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

  • Нет связанных вопросов^_^