Каков стандартный строковый формат (туда и обратно) для Java объектов DateTime - PullRequest
1 голос
/ 09 июля 2020

У меня есть REST-сервер (в C#, версия * в Java), у которого есть клиенты на множестве языков (плюс Swagger).

Мне нужно (де) сериализовать LocalDateTime, ZonedDateTime и OffsetDateTime (). Поиграв с кодом для каждого из них, я считаю, что toString () дает мне текст ISO с возможностью округления для каждого из них.

Это правильно?

Если нет, что мне использовать?

ps - Мы сокращаем любое datetime до одного из трех классов выше. Это должно справиться с любым вариантом использования.

1 Ответ

1 голос
/ 09 июля 2020

Закрыть.

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

...