joda форматирование времени ISO DateTime

Я использую время joda для форматирования входной строки даты ISO, но получаю исключение, что моя дата ISO искажена:

Invalid format: "2014-06-20T11:41:08+02:00" is malformed at "+02:00"

Это мой код:

val formatter: DateTimeFormatter = ISODateTimeFormat.dateTime.withZone(DateTimeZone.getDefault)
val date: DateTime = formatter.parseDateTime("2014-06-20T11:41:08+02:00")

Что здесь не так?


person pichsenmeister    schedule 20.06.2014    source источник
comment
Строка формата данных: ггггММдд'Т'ЧЧммсс.SSSZ. Следовательно, вам нужна точка (.) и три цифры между секундами и часовым поясом. Три цифры являются обязательными и представляют собой миллисекунды.   -  person stefan.schwetschke    schedule 20.06.2014


Ответы (2)


Комментарий к ошибке здесь немного вводит в заблуждение, поскольку модуль форматирования Joda, который вы получаете от ISODateTimeFormat, ожидает присутствия миллисекундной части строки даты/времени, поэтому следующее будет работать нормально:

val formatter: DateTimeFormatter = ISODateTimeFormat.dateTime().withZone(DateTimeZone.getDefault())
val date: DateTime = formatter.parseDateTime("2014-06-20T11:41:08.0+02:00")
person Norbert Radyk    schedule 20.06.2014

ответ Радыка правильный.

Встроенные форматы ISO 8601

Однако вам вообще не нужно указывать средство форматирования. Класс DateTime содержит встроенный синтаксический анализатор для вашего формата, совместимого с ISO 8601, который автоматически используется конструктор.

DateTime dateTime = new DateTime( "2014-06-20T11:41:08+02:00", timeZone );

Хотя второй аргумент является необязательным, я предлагаю вам назначить DateTimeZone, который будет назначен объекту DateTime, если вы знаете такой часовой пояс. Входная строка имеет смещение от UTC, но часовой пояс — это больше, чем просто смещение. Часовой пояс включает правила для летнего времени и других аномалий. Используйте правильные названия часовых поясов, а не трех- или четырехбуквенные коды, такие как EST или IST.

Другие форматы

Вы можете применить множество других форматов:

Например, если вам нужна только часть даты без времени дня в представлении String, вызовите ISODateTimeFormat.date() для доступа к встроенному средству форматирования.

Пример кода в Joda-Time 2.8.

String output = ISODateTimeFormat.date().print( dateTime );  // Format: yyyy-MM-dd

Найдите в StackOverflow сотни других вопросов и ответов о форматировании значений даты и времени.

person Basil Bourque    schedule 20.06.2014
comment
спасибо за Ваш ответ. есть ли способ распечатать именно этот формат с помощью joda datetime? - person pichsenmeister; 20.06.2014
comment
Тот же встроенный модуль форматирования используется по умолчанию в методе DateTime toString. String output = dateTime.toString(); если вы хотите, чтобы строки генерировались в других форматах, изучите класс DateTimeFormat, включая методы forPattern и forStyle и подкласс ISODateTimeFormat. - person Basil Bourque; 20.06.2014