约会丢失了一天

在客户端,我使用dd / MM / yyyy日期格式。该字段使用 twitter bootstrap 3 日期时间选取器 (https://eonasdan.github.io/bootstrap-datetimepicker/)

我通过twitter bootstrap 3日期时间选择器24 / 07 / 2015
在我发送的json中输入,我看到:出生日期:“24 / 07 / 2015”

在我的dto中,我做

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd/MM/yyyy")
private Date birthdate;

当我在服务器上收到日期时,在我的dto中看到: 23/07/2015 19:00

失去了一天。

有什么解释吗?


答案 1

根据JacksonFAQDateHandling页面:

Jackson 构建的所有具有关联时区(java.util.Calendar 等)的时间对象都使用标准时区 (GMT),而不是本地时区(无论该时区是什么)。也就是说:杰克逊默认使用GMT进行所有处理,除非另有明确说明。

在您的情况下,日期似乎会自动转换为GMT / UTC。尝试明确提供您的本地时区以避免UTC转换[如问题中所述,为什么这个时间偏离了9小时?(5小时,3小时等)在同一页上]:

@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="dd/MM/yyyy", timezone="EST")

其次,我认为您正在使用打印日期。请注意,java 类与时区无关,但其方法在打印之前使用系统的默认时区。Date.toString()DatetoString()

这里看起来它正在被转换为 .这两者都代表相同的时间时刻,但时区不同。24/07/2015 00:00 UTC23/07/2015 19:00 ESTtoString()


答案 2

AimZ的答案是指向我的原因,但是我将这三行添加到我的apprament.properties文件中并实现了同样的事情

spring.jackson.date-format=yyyy-MM-dd

spring.jackson.serialization.write-dates-as-timetamps:false

春季杰克逊时区:美国东部时间