java - jackson :使用时区 ID 解析 ZonedDateTime

标签 java spring-mvc spring-boot jackson java-time

使用 Spring MVC(Spring boot)我可以从

中反序列化 ZonedDateTime
2016-07-26T05:30:47+01:00

但不是来自

2016-07-26T05:30:47+01:00 Europe/Paris

如何显式添加时区并仍然能够反序列化它?

最佳答案

您可以指定一个带有可选部分的模式(由 [] 分隔),以指示某些字段是可选的,并使用 @JsonFormat 将其添加到相应的字段中注释。

例如,拿这门课:

public class OptionalTimeZoneTest {

    @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ssXXX[ VV]")
    private ZonedDateTime date;

    // getter and setter
}

注意最后一部分([ VV]):[] 中的模式是一个可选部分,因此解析器会尝试解析它(如果存在)。和图案 VV是时区 ID(或时区名称;有关更多详细信息,请查看 javadoc )

有了这个,两种格式都可以读取:

ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
// add this to preserve the same offset (don't convert to UTC)
mapper.configure(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE, false);

// without timezone
String json = "{ \"date\": \"2016-07-26T05:30:47+01:00\" }";
OptionalTimeZoneTest value = mapper.readValue(json, OptionalTimeZoneTest.class);
System.out.println(value.getDate()); // 2016-07-26T05:30:47+01:00

// with timezone
json = "{ \"date\": \"2016-07-26T05:30:47+01:00 Europe/Paris\" }";
value = mapper.readValue(json, OptionalTimeZoneTest.class);
System.out.println(value.getDate()); // 2016-07-26T05:30:47+02:00[Europe/Paris]

输出是:

2016-07-26T05:30:47+01:00
2016-07-26T05:30:47+02:00[Europe/Paris]

请注意,在第一种情况下,输出为 2016-07-26T05:30:47+01:00 (因为它没有时区,所以应用了 +01:00 偏移量)。

但在第二种情况下,输出是 2016-07-26T05:30:47+02:00[Europe/Paris] ,因为在 Europe/Paris时区,26/07/2016 is summer-time (所以偏移量是 +02:00 )。和 java.time API 的实现方式是在解析此类 String 时时区优先.


如果你想要所有ZonedDateTime要转换为 UTC 的实例,您可以删除此行:

mapper.configure(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE, false);

没有它,日期将被转换为 UTC,输出将是:

2016-07-26T04:30:47Z[UTC]
2016-07-26T03:30:47Z[UTC]

关于java - jackson :使用时区 ID 解析 ZonedDateTime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38654959/

相关文章:

java - 此代码中出现越界异常

java - 在java opencv中从MatOfKeyPoint获取前100个值

spring-mvc - 在 Servlet 3+ 环境中添加要在 spring-security 过滤器之后调用的自定义过滤器

java - 必须使用 Activity 访问 token 来查询有关当前用户的信息 - OAuthException Spring Social

java - https : The Tomcat connector configured to listen on port 8444 failed to start.之后的 Spring 启动

java - Azure Spring Boot功能-如何将触发器和输入绑定(bind)同时传递给handleRequest方法?

java - 如何在WebFlux中正确实现CORS?

java - Spring JDBC : Returning 0 or 1 rows

Java、SQL 数据库连接

java - 使用 prometheus 的自定义计数器在/actuator/prometheus 上不可见