Java 为约会失去了一天
在客户端,我使用dd/MM/yyyy日期格式。该字段使用twitter引导3日期时间选择器() 我通过twitter bootstrap 3 datetime picker于2015年7月24日输入Java 为约会失去了一天,java,json,jackson,orika,spring-restcontroller,Java,Json,Jackson,Orika,Spring Restcontroller,在客户端,我使用dd/MM/yyyy日期格式。该字段使用twitter引导3日期时间选择器() 我通过twitter bootstrap 3 datetime picker于2015年7月24日输入 在我发送的json中,我看到:生日:“24/07/2015” 在我的dto中,我知道 @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd/MM/yyyy") private Date birthdate; 当我在服务器上收到日期时,
在我发送的json中,我看到:生日:“24/07/2015” 在我的dto中,我知道
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd/MM/yyyy")
private Date birthdate;
当我在服务器上收到日期时,在我的数据中看到:23/07/2015 19:00
失去了一天
有什么解释吗?根据第页:
具有关联时区(java.util.Calendar)的所有时间对象
等)Jackson构建使用标准时区(GMT),不使用
本地时区(不管是什么)。也就是说:杰克逊默认为
除非另有特别说明,否则所有处理均使用GMT
在您的情况下,日期似乎自动转换为GMT/UTC。尽量明确提供您的本地时区,以避免UTC转换[如同一页上的问题“为什么这一时间会缩短9小时?”(5小时、3小时等)中所述]:
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="dd/MM/yyyy", timezone="EST")
其次,我认为您正在使用Date.toString()
打印日期。该javaDate
类与时区无关,但其toString()
方法在打印之前使用系统的默认时区
这里看起来
2015年7月24日00:00 UTC
正在通过toString()
转换为2015年7月23日19:00东部标准时间。这两行代表相同的时刻,但在不同的时区。AimZ的答案是我指出的,但我将这三行添加到application.properties文件中,并实现了相同的功能
spring.jackson.date格式=yyyy-MM-dd
spring.jackson.serialization.将日期写入时间戳:false
spring.jackson.时区:EST也有同样的问题。使用邮递员验证客户不是罪魁祸首。似乎Jackson使用的时区与系统的时区有问题。必须更改Jackson配置以补偿日期
@Configuration
public class JacksonConfig {
@Bean
@Primary
public Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder() {
final Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder = new Jackson2ObjectMapperBuilder();
jackson2ObjectMapperBuilder.timeZone(TimeZone.getDefault());
jackson2ObjectMapperBuilder.serializationInclusion(JsonInclude.Include.NON_EMPTY);
jackson2ObjectMapperBuilder.featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
return jackson2ObjectMapperBuilder;
}
}
我在JavaScript中从日期选择器中选择日期时遇到了同样的问题。我使用.toString()方法格式化了字段,但是函数给了我一个不同的日期(我也把一天搞乱了)。像这样:
var mydate=新日期('2020-04-03');
log(mydate.toString())代码>
//周四2020年4月2日20:00:00 GMT-0400(东部夏时制)
我改为使用.toutString()修复了它
var mydate = new Date('2020-04-03');
console.log(mydate.toUTCString());
//Fri, 03 Apr 2020 00:00:00 GMT
我在java中也遇到了同样的问题。您可以使用ObjectMapper设置为默认时区
ObjectMapper mapper = ((MappingJackson2HttpMessageConverter) converter).getObjectMapper();
mapper.setTimeZone(TimeZone.getDefault());
解决方案如下:
完整配置类:
@Configuration
@EnableWebMvc
public class WebMvcConfiguration implements WebMvcConfigurer {
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
for (HttpMessageConverter converter : converters) {
if (converter instanceof org.springframework.http.converter.json.MappingJackson2HttpMessageConverter) {
ObjectMapper mapper = ((MappingJackson2HttpMessageConverter) converter).getObjectMapper();
mapper.registerModule(new Hibernate5Module());
mapper.setTimeZone(TimeZone.getDefault());
}
}
}
@配置
@EnableWebMvc
公共类WebMVCConfigure实现WebMVCConfiguer{
@凌驾
public void extendMessageConverters(列表)您是否检查了系统上的本地时间设置?客户端/服务器位于同一台计算机上:两者都是edt-4小时(mtl时间)…这绝对是一个时区转换问题。一方将时间视为UTC,另一方将时间转换为本地时间。我们在与第三方系统的客户机/服务器集成中遇到了此问题。死掉的赠品是添加到另一时间的“19:00”,正好相差5小时(实际上不是一整天)。我在浏览器端获得新日期:2015年7月24日星期五23:49:26 GMT-0400(EDT)。在服务器上获得:2015年7月23日星期五23:49:26 EDT。我认为东部夏令时(EDT)=GMT-4(美国+加拿大)如果您使用Postman之类的工具查询服务,那么日期是否不正确?在我的例子中,问题出在restTemplate客户端,而不是服务器上。我不使用toString(),但当@JsonFormat(shape=JsonFormat.shape.STRING,pattern=“dd/MM/yyyy”)时肯定会出现,toString可能会被调用。是否有一个标准的解决方案来管理此问题?只保留gmt日期…但需要知道用户的时区才能正确显示日期。也许可以使用java 8或joda的新日期?最佳做法是在数据库中存储UTC中的日期/时间信息,并存储用户的时区。然后使用在时区向用户显示日期或在存储之前删除时区偏移。有许多文章列出了这种方法的优点,即应用程序可以支持不同的时区。Java8 Date API提供了一组新的类来处理日期/时间。这是一篇关于Java8 Date API的好文章。Java8或Joda简化了日期/时区e处理。