tl; dr
OffsetDateTime.parse(
"2019-02-28T12:17:46.279+0000" ,
DateTimeFormatter.ofPattern( "uuuu-MM-dd'T'HH:mm:ss.SSSX" , Locale.ROOT )
)
java.time
Вы используете ужасный класс Calendar
, который был вытеснен несколько лет назад классами java.time .
ISO 8601
Ваша входная строка имеет стандартный формат ISO 8601 , предназначенный для машиночитаемых текстовых представлений значений времени и даты.Это хорошая вещь.
Классы java.time по умолчанию используют форматы ISO 8601 при разборе / генерации строк.
OffsetDateTime
Вы должны можно просто анализировать с OffsetDateTime
.
OffsetDateTime.parse( "2019-02-28T12:17:46.279+0000" )
… но, к сожалению, необязательный символ COLON, опускаемый из смещения (+00:00
), является проблемой.Класс OffsetDateTime
имеет небольшую ошибку, когда он отказывается анализировать без этого символа.Ошибка обсуждается здесь и здесь .
Стандарт ISO 8601 разрешает отсутствие двоеточия, но практически всегда следует включать его.OffsetDateTime
класс не одинок;Я видел другие библиотеки, которые ломаются, когда отсутствуют двоеточия или дополняющие нули.Я предлагаю попросить издателя ваших данных использовать полный формат ISO 8601, включая двоеточие.
Обходной путь для ошибки OffsetDateTime
заключается в явном определении DateTimeFormatter
.
DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-dd'T'HH:mm:ss.SSSX" , Locale.ROOT ) ;
Затем выполните синтаксический анализ.
String input = "2019-02-28T12:17:46.279+0000" ;
OffsetDateTime odt = OffsetDateTime.parse( input , f ) ;
Чтобы сгенерировать текст в полном стандартном формате ISO 8601, просто позвоните toString
.
String output = odt.toString() ;
См. Этот код, запущенный в режиме реального времени на IdeOne.com.
вывод: 2019-02-28T12: 17: 46.279Z
Z
на конце означает UTC, то есть +0000
или+00:00
.Произносится «Зулу».Очень часто используется, более читабельно, чем числовое смещение.
Если вы хотите использовать тот же формат вывода, что и для ввода, используйте тот же DateTimeFormatter
.
String output = odt.format( f ) ;