Как добавить часовой пояс сервера в localdatetime во время сериализации JSON?
Я использую LocalDateTime для всех временных меток в веб-службе RESTful, и все инициализации и изменения временных меток производятся на сервере.
Когда клиент службы создает некоторый ресурс, сервер внутренне назначает метку времени создания этому ресурсу.
class Resource {
private String data;
private LocalDateTime creationTimestamp;
public Resource(String someData) {
this.data = someData;
this.creationTimestamp = LocalDateTime.now();
}
}
Сервер возвращает ресурс обратно в формате JSON:
{
"data" : "someData",
"creationTimestamp" : "2017-09-22T12:03:44.022"
}
Когда клиент оказывает creationTimestamp
он не знает часовой пояс сервера, в котором была создана эта временная метка, и неправильно отображает время.
Я вижу единственный способ решить эту проблему: изменить все метки времени в приложении на ZonedDateTime и вернуть их обратно клиенту вместе с часовым поясом в JSON. Но такой подход очень дорогой.
Есть ли другой способ решить эту проблему?
1 ответ
Почему бы не хранить все метки времени как объекты типа java.time.Instant
на сервер и отправка мгновений клиентам?
Это означает:
class Resource {
private String data;
private Instant creationTimestamp;
public Resource(String someData) {
this.data = someData;
this.creationTimestamp = Instant.now();
}
}
Тогда задача клиента - распечатать момент в часовом поясе клиента.
Такой подход позволяет избежать отправки больших объемов данных, а также является тонким решением на сервере. И это моделирование концепции хранения UTC-временных меток на сервере, которая понятна для всех клиентов. Для клиентского форматирования моментов / моментов, например, так:
DateTimeFormatter dtf = ...; // custom format (maybe localized)
Instant serverInstant = ...;
String formatted =
dtf.format(serverInstant.atZone(ZoneId.of("Europe/Berlin")));
// or ZoneId.systemDefault()