Закрыть.
LocalDateTime
и OffsetDateTime
сериализуются в ISO 8601 из своих методов toString
. И они всегда могут проанализировать созданную строку с помощью своих методов с одним аргументом parse
. Ваш обратный путь завершен. Однако это не означает, что они анализируют каждый вариант ISO 8601.
Для ZonedDateTime
разработчики java .time изобрели собственное расширение для ISO 8601: идентификатор часового пояса в квадратных скобках, часто заканчивающаяся напечатанная строка, не является частью ISO 8601. Например, ZonedDateTime
может печатать строку 2020-07-09T20:58:09.445153+02:00[Europe/Zurich]
. Часть 2020-07-09T20:58:09.445153+02:00
соответствует стандарту ISO 8601. Часть [Europe/Zurich]
- нет. Europe / Zurich - это идентификатор часового пояса IANA, поэтому многие языки должны иметь возможность его обрабатывать. И если вам действительно нужно обрабатывать часовой пояс (а не только смещение UT C), я сомневаюсь, что будет лучшая ставка. Сам ISO 8601 не предлагает ничего для обработки истинных часовых поясов. Если в ZonedDateTime
указано смещение в качестве «часового пояса», идентификатор в квадратных скобках не печатается, поэтому в этом случае вся строка соответствует ISO 8601.
И вы правы, ISO 8601 является стандартом для данных даты и времени и рекомендуется для вашего использования.
Цитаты в документации
От LocalDateTime.toString()
:
Результатом будет один из следующих форматов ISO-8601:…
OffsetDateTime.toString()
:
Вывод будет в одном из следующих форматов ISO-8601:…
ZonedDateTime.toString()
:
Формат состоит из LocalDateTime за которым следует ZoneOffset. Если ZoneId не совпадает со смещением, то выводится идентификатор. Вывод совместим с ISO-8601, если смещение и ID совпадают.
Ссылка: связанный вопрос: ZonedDateTime toString совместимость с ISO 8601