Java 为约会失去了一天

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; 当我在服务器上收到日期时,

在客户端,我使用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;
当我在服务器上收到日期时,在我的数据中看到: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()
打印日期。该java
Date
类与时区无关,但其
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处理。