@JsonFormat转换时区不正确的日期

时间:2018-12-11 08:02:15

标签: java json datetime jackson

我有一个带有 Date 字段的简单POJO,其初始值为:

1985-09-17T01:00:00.000+0400

然后将此日期值映射到带有注释的 Date 字段的DTO:

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ssX")
private Date dateOfBirth;

然后显示结果:

1985-09-16T21:00:00Z

我尝试在@JsonFormat中设置 timestamp 属性,但这没有帮助,日期仍然无效。

如何正确转换日期?

2 个答案:

答案 0 :(得分:4)

java.util.Date中的值是自Unix纪元以来的毫秒数,该纪元发生在UTC的1970年1月1日午夜。由于距固定时间段以来的毫秒数,java.util.Date中的值在世界各地在任何特定时刻都是相同的,而与本地时区无关。

因此,如果您使用Java 8 ZonedDateTime

,则最好使用ZonedDateTime

答案 1 :(得分:2)

两个日期都代表同一时刻:

  • 1985-09-17T01:00:00.000 + 0400
  • 1985-09-16T21:00:00Z

当您在Java中打印日期时,它使用VM的当前时区,但是在内部,Date类将该信息存储在long中,表示自纪元以来的时间(以毫秒为单位)。

如果愿意,可以使用DateFormat的{​​{3}}方法使用自定义时区来获取日期的字符串表示形式:

  

设置此DateFormat对象的日历的时区。

这是一个简单的代码段:

Date date = ...
DateFormat formatter = ...
TimeZone timeZone = ...

// Set a custom timezone
formatter.setTimeZone(timeZone);

// Get a string representation of the daet with a custom timezone
String formattedDateWithCustomTimezone = formatter.format(date);