2

我将 LocalDateTime 用于 RESTful Web 服务中的所有时间戳,并且所有时间戳的初始化和更改都在服务器上进行。
当服务的客户端创建一些资源时,服务器会在内部为该资源分配创建时间戳。

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 中的时区一起返回给客户端。但是这种方法非常昂贵。

有没有其他方法可以解决这个问题?

4

1 回答 1

2

为什么不将所有时间戳作为类型对象存储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() 
于 2017-09-22T09:24:03.897 回答