java - Jackson jsonformat 总是在 UTC 中反序列化

标签 java json jackson timezone jackson2

Jackson 的 jsonformat 注释并不像我预期的那样工作。

假设在 Java SimpleDateFormat 中:

SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy");
Date date = sdf.parse("1-Mar-2018");

date 对象值为 1-Mar-2018 SGT。这很好,因为我的时区在新加坡。

现在我有一个发布 json 值的 http 网络服务:

{
  "filterDate": "01-Mar-2018"
}

在我的 bean 中,我用

注释它
@JsonFormat(pattern = "dd-MMM-yyyy")
public void setDeliveryDate(Date deliveryDate) {
    this.deliveryDate = deliveryDate;
}

确定 deliveryDate 的值为 1-Mar-2018 UTC

当我这样做的时候:

@JsonFormat(pattern = "dd-MMM-yyyy", timezone="Asia/Singapore")
public void setDeliveryDate(Date deliveryDate) {
    this.deliveryDate = deliveryDate;
}

还是反序列化成1-Mar-2018 UTC,我觉得应该是1-Mar-2018 SGT

为什么会这样?

最佳答案

timezone 参数用于根据 JsonFormat documentation 序列化而不是像您的帖子中那样进行反序列化。鉴于Date,我看不出它如何用于反序列化“旨在反射(reflect)协调世界时 (UTC)”,并且不包含时区信息。

考虑切换到 ZonedDateTime ,自 Java 8 起可用,如果您想为 deliveryDate 指定时区。

如果您必须使用Date,您可以指定一个默认时区,无论何时打印或格式化任何Date 对象,例如

TimeZone.setDefault(TimeZone.getTimeZone("Asia/Singapore"));
System.out.println(new Date());

产生

Tue Mar 06 21:15:12 SRET 2018

关于java - Jackson jsonformat 总是在 UTC 中反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49061391/

相关文章:

java - Spring Security 多个登录用户失败

java - 突出显示 JTextArea 的特定部分

javascript - 使用javascript中的搜索字符串过滤嵌套的对象数组

java - 具有完整 POJO 数据绑定(bind)的 Jackson 自定义过滤器

java - 使用 AJAX GET 方法进行 CSRF token 保护

使用 XStream 进行 Java XML 解析

javascript - JS setTimeout 每隔一段时间添加/删除类

java - 如何使用改造在 api post 方法中将字符串作为主体传递?

java - Spring MVC 在 POST 上不支持内容类型 'application/json'

java - 尝试映射 Json 时出现 JsonParseException