Правильный класс Java для представления даты в часовом поясе UTC - PullRequest
0 голосов
/ 10 мая 2018

У меня есть приложение REST API Spring Boot (Jackson marshalling), где я буду обрабатывать все даты / время (время начала и окончания для расписаний) как находящиеся в часовом поясе UTC. Что такое «правильный» класс Java, который я должен использовать в своем коде для хранения этих даты / времени? Я чувствую, что мы должны быть явными и использовать OffsetDateTime с внутренним часовым поясом как UTC на тот случай, если нам понадобится переключать часовые пояса или печатать / регистрировать даты и т. Д.

Мысли? Будет ли LocalDateTime нормально использовать для простоты, поскольку все они будут в формате UTC?

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Если вы выбираете UTC в качестве нейтрального представления часового пояса, что является хорошей идеей, я предлагаю Instant из java.time. Instant - это момент времени. Концептуально у него нет часового пояса. Похоже, это было бы преимуществом. Вы можете переключать часовые пояса все, что вы хотите позже, и ваши моменты времени останутся прежними. Instant можно проанализировать из строки ISO 8601 в UTC, используя метод parse (например, 2018-12-31T23:37:45.975Z). И его toString производит то же самое, все еще всегда в UTC.

Если вы хотите получить явное представление о том, что ваша дата и время указаны в UTC, вы можете использовать OffsetDateTime со смещением ZoneOffset.UTC. Поскольку вы говорите, что в UTC ваши времена всегда , я бы счел это излишним.

0 голосов
/ 10 мая 2018

Вам необходимо использовать ZonedDateTime . LocalDateTime не имеет никакой информации о зоне (даже UTC).

Для работы с Джексоном необходимо включить библиотеку jsr310 для автоматической сериализации / десериализации классов даты / времени Java 8.

<dependency>
  <groupId>com.fasterxml.jackson.datatype</groupId>
  <artifactId>jackson-datatype-jsr310</artifactId>
</dependency>

Также по умолчанию ObjectMapper анализирует дату / время в UTC Zone , что будет полезно в вашем случае. Модуль jsr310 будет автоматически зарегистрирован при загрузке Spring. Если вы хотите создать свой собственный ObjectMapper, вам нужно использовать

ObjectMapper mapper = new ObjectMapper();

// will register all modules on classpath
mapper.findAndRegisterModules();

// only jsr310 module will be registered
mapper.registerModule(new JavaTimeModule());
...