如何在JSON序列化期间将服务器时区添加到localdatetime?

问题描述:

对RESTful Web服务中的所有时间戳使用LocalDateTime,并且所有时间戳都在服务器上进行初始化和更改。
当服务的客户端创建一些资源时,服务器会在内部为该资源分配创建时间戳。如何在JSON序列化期间将服务器时区添加到localdatetime?

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

LocalDateTime没有时区。另外,您使用的是哪个JSON序列化库? –

+0

@MarkRotteveel,我知道它没有时区,因此我在考虑迁移到ZonedDateTime。我使用杰克逊JSON序列化 –

为什么不在服务器上将所有时间戳存储为类型为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() 
+0

这种方法似乎更方便,谢谢。 –