如何在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中的时区一起返回给客户端。 但是这种方法非常昂贵。
有没有其他方法可以解决这个问题?
答
为什么不在服务器上将所有时间戳存储为类型为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
这种方法似乎更方便,谢谢。 –
LocalDateTime没有时区。另外,您使用的是哪个JSON序列化库? –
@MarkRotteveel,我知道它没有时区,因此我在考虑迁移到ZonedDateTime。我使用杰克逊JSON序列化 –