Как стать автором
Обновить

Комментарии 6

По механизму сериализации все понятно, а вот по сути проблемы есть вопрос.
В ответ возвращать дату и время с указанием серверного часового пояса

Кажется странным, что клиент отдает время со своим часовым поясом, а в ответ получает с часовым поясом сервера. Т.е. получается, что на клиенте все равно есть преобразование серверного пояса в клиентский? Если так, то не проще и при отправке на сервер тоже отправлять сразу с серверным часовым поясом? К слову, часто так и делают. Хранят все в utc и на клиенте приводят к нужному виду.

Поддержу. Имхо, всегда лучше стараться исключить сервере время как таковое: использовать или время по UTC (Instant), или локальное по отношению к клиенту/источнику запроса/т.п.

Я полагал, что по сути проблемы могут быть вопросы, поэтому делал акцент на самом механизме.
Сам по себе подход не рекомендация к действию. А ситуации могут быть разные. К примеру, требования со стороны клиента
Хорошая статья. Добавил в закладки.

Если кому-нибудь понадобится де/сериализация отдельного поля:

@JsonFormat(shape=JsonFormat.Shape.STRING, pattern=«yyyy-MM-dd'T'HH:mm:ss.SSSZ», timezone=«America/Phoenix»)
private Date date;

Используйте grpc и timestamp proto message и вам не надо будет решать бородатые проблемы, включая awkward json serialization и изживший себя Jackson mapper.
И да, время ВСЕГДА хранится в utc, даже если вы решите остаться с json.

Решение сложное, низкопроизводительное и имеет баги.
В вашем решении вы передаёте текущую дату методу getOffset. Если временная зона предполагает DST и между обрабатываемым и текущим временем был переход на зимнее/летнее время, возникнет ошибка.
Также я бы вообще воздержался от использования ZoneOffset.systemDefault().getRules(), так как он порождает лишние объекты, в частности тяжёлый ConcurrentHashMap.
Я бы сохранил в статическое поле следующий форматтер: var fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssxxx");, использовать его так: localDateTime.atZone(ZoneId.systemDefault()).format(fmt)

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории