在客户端,我使用dd/MM/yyyy日期格式。字段使用twitter bootstrap 3日期时间选择器(https://eonasdan.github.io/bootstrap-datetimepicker/)
我进入通过twitter引导程序3日期时间选择器24/07/2015
在我的json我发送,我看到:出生日期:“2015年7月24日”
在我的dto中,我是这样做的。
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd/MM/yyyy")
private Date birthdate;
当我在服务器上收到日期时,在我的数据中看到:2015年7月23日19:00
一天就丢了。
有解释吗?
6条答案
按热度按时间y4ekin9u1#
我在JavaScript中从日期选择器中选择日期时遇到了同样的问题。我使用**.toString()方法格式化字段,但函数给我的日期不同(我也搞砸了一天)。如下所示:
var mydate = new Date('2020-04-03'); console.log(mydate.toString());
//Thu Apr 02 2020 20:00:00 GMT-0400 (Eastern Daylight Time)
个我使用.toUTCString()**修复了它。
1aaf6o9v2#
我在java中也遇到过同样的问题。
解决方案:Jackson @JsonFormat set date with one day less
完整配置类:
nfg76nw03#
这周我也遇到了同样的问题。对我们来说,问题是我们使用的解码器。我们的项目使用feing,我们使用JacksonDecoder来解码JSON,所以我们改用GsonDecoder,这样问题就解决了。
qgzx9mmu4#
显示JacksonFAQDateHandling页面:
Jackson构造的所有具有相关时区的时间对象(java.util.Calendar等)都使用标准时区(GMT),而不是本地时区(不管是什么)。也就是说:Jackson默认使用GMT进行所有处理 ,除非 * 特别说明。
在您的情况下,日期似乎自动转换为GMT/UTC。请尝试明确提供您的本地时区,以避免UTC转换[如同一页上的问题 * Why come this time is off by 9 hours?(5 hours,3 hours etc) 中所述]:
其次,我认为您使用
Date.toString()
来打印日期。Note javaDate
类是独立于时区的,但它的toString()
方法在打印前使用系统的 * 默认 * 时区。这里看起来像是
24/07/2015 00:00 UTC
被toString()
转换成23/07/2015 19:00 EST
,这两个都代表同一个时间点,但是在不同的时区。ws51t4hk5#
AimZ的答案是我的答案,但我将这三行添加到我的application.properties文件中,并实现了同样的效果
日期格式=年-月-日
spring.jackson.序列化.将日期作为时间戳写入:false
spring.jackson.时区:美国东部时间
oaxa6hgo6#
有同样的问题。使用 Postman 来验证客户端不是罪魁祸首。似乎是Jackson使用的时区与系统的时区有问题。不得不更改Jackson配置以补偿日期