Преобразование объекта DateTime в строку - PullRequest
0 голосов
/ 21 февраля 2019

У меня простой вопрос.Как я могу преобразовать дату ISO-8601 в строку?Я использую дату в следующем формате: 2019-02-05T08:21:15.000+01:00 и хочу преобразовать этот объект даты в строку.Я пробовал следующее:

String startString = (String) jsonObjectMap2.get("created_on"); 
//startString = "2019-02-21T09:47:58.699004+00:00"`
DateTime start = ISODateTimeFormat.dateTimeParser().parseDateTime(startString);
DateFormat dateFormat = new SimpleDateFormat("yyyy-mm-dd'T'hh:mm:ss.SSSZ+|-hh:mm"); 
String formatedStartString = dateFormat.format(start);`

Но я получаю следующую ошибку:

java.lang.IllegalArgumentException: Невозможно отформатировать данный объект как дату.

Какая правильная форма DateFormat?Я надеюсь, что вы можете помочь мне, спасибо заранее.

Ответы [ 5 ]

0 голосов
/ 21 февраля 2019

tl; др

java.time.OffsetDateTime.parse( "2019-02-21T09:47:58.699004+00:00" )

java.time

Какой класс DateTime?Если вы используете Joda-Time, знайте, что проект Joda-Time сейчас находится в режиме обслуживания.Его создатель, Стивен Колборн, возглавил JSR 310 и внедрил классы java.time , встроенные в Java.

Нет необходимости форматировать шаблон

Ваша входная строкав стандартном формате ISO 8601 .Классы java.time по умолчанию используют форматы ISO 8601 при разборе / генерации строк.

String input = "2019-02-21T09:47:58.699004+00:00" ;  // Standard ISO 8601 format.

OffsetDateTime

В вашей входной строке указано смещение от UTC , но не часовой пояс.Таким образом, соответствующий класс для представления этого значения: OffsetDateTime.

OffsetDateTime odt = OffsetDateTime.parse( input ) ;

О java.time

java.time framework встроен в Java 8 и новее.Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

Чтобы узнать больше, см. Oracle Tutorial .И поиск переполнения стека для многих примеров и объяснений.Спецификация: JSR 310 .

Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на java.time классы.

Вы можете обмениваться java.time объектами напрямую с вашей базой данных.Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии.Нет необходимости в строках, нет необходимости в java.sql.* классах.

Где получить классы java.time?

  • Java SE 8 , Java SE 9 , Java SE 10, Java SE 11 и более поздние версии - часть стандартного Java API с связанной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и JavaSE 7
    • Большинство функций java.time перенесено в Java 6 & 7 в ThreeTen-Backport .
  • Android
    • Более поздние версии реализации связки Android java.time классы.
    • Для более ранних версий Android (<26) проект <a href="https://github.com/JakeWharton/ThreeTenABP" rel="nofollow noreferrer"> ThreeTenABP адаптируется ThreeTen-Backport (упомянуто выше).См. Как использовать ThreeTenABP… .

ThreeTen-Extra Проект расширяет java.time дополнительными классами.Этот проект является полигоном для возможных будущих дополнений к java.time.Здесь вы можете найти некоторые полезные классы, такие как Interval, YearWeek, YearQuarter и more .

0 голосов
/ 21 февраля 2019

Я нашел следующее, чтобы работать для меня

DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS[XXX]");
String formatted = zonedDateTime.format(dateTimeFormatter);
0 голосов
/ 21 февраля 2019

почему бы не использовать toString () для вашего объекта DateTime?

0 голосов
/ 21 февраля 2019

Как отметил Томас в комментариях, DateTime.format() потребляет объект Date, а не объект DateTime;следовательно IllegalArgumentException.Судя по формату вашей даты, вы можете попробовать проанализировать startString, используя встроенный класс java.time.ZonedDateTime:

ZonedDateTime dateTime = ZonedDateTime.parse(startString) //it can parse ISO-8601 date-times

Затем вы можете отформатировать объект dateTime, используя статический java.time.DateTimeFormatter.ofPattern() метод, который использует шаблон String для применения к вашей дате и времени и возвращает отформатированную дату в виде строки:

String formattedDateTime = dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'hh:mm:ss.SSSZ+|-hh:mm"));

РЕДАКТИРОВАТЬ

Как указал Василий, объект OP DateTime включает смещение по времени, которое не обязательно является смещением часового пояса - как представлено классом ZonedDateTime.Таким образом, наиболее подходящий класс для использования в этом сценарии - OffsetDateTime, который предоставляет те же возможности, но больше подходит для данного варианта использования.См. ответ Василия Бурка

0 голосов
/ 21 февраля 2019

Я не уверен, что это решит вашу проблему, но mm должен быть в верхнем регистре, т. Е. MM, потому что MM описывает месяцы, а mm описывает минуты.

см. Следующий код:

DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss.SSSZ+|- 
    hh:mm");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...