失去了一天的约会

rob*_*del 14 java json jackson orika spring-restcontroller

在客户端,我使用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;
Run Code Online (Sandbox Code Playgroud)

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

有一天失去了.

任何解释?

小智 12

根据JacksonFAQDateHandling页面:

与Jackson构造的关联TimeZone(java.util.Calendar等)的所有时间对象使用标准时区(GMT),而不是本地时区(无论可能是什么).即:杰克逊默认使用GMT进行所有处理,除非另有说明.

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

@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="dd/MM/yyyy", timezone="EST")
Run Code Online (Sandbox Code Playgroud)

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

这看起来像24/07/2015 00:00 UTC被转换为23/07/2015 19:00 EST通过toString().这两者代表相同的时刻,但在不同的时区.