Как добавить часовой пояс сервера в 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() 
Другие вопросы по тегам