失去了一天的约会

时间:2015-07-25 02:27:06

标签: 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;

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

有一天失踪。

任何解释?

5 个答案:

答案 0 :(得分:12)

根据JacksonFAQDateHandling页面:

  

具有关联TimeZone的所有时间对象(java.util.Calendar   杰克逊构建使用标准时区(GMT),   当地时区(无论可能是什么)。那就是:杰克逊默认为   使用GMT进行所有处理,除非明确说明。

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

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

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

此处看起来24/07/2015 00:00 UTC23/07/2015 19:00 EST转换为toString()。这两个代表了相同的时刻时间,但在不同的时区。

答案 1 :(得分:0)

AimZ答案是指出我这一点的原因,但我将这三行添加到了application.properties文件中,并实现了相同的目的

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

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

spring.jackson.time-zone:EST

答案 2 :(得分:0)

有同样的问题。使用邮递员来验证客户端不是罪魁祸首。似乎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;
    }

}

答案 3 :(得分:0)

从日期选择器中选择日期时,我在 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()

var mydate = new Date('2020-04-03');

console.log(mydate.toUTCString());

//Fri, 03 Apr 2020 00:00:00 GMT

答案 4 :(得分:0)

我在java中遇到了同样的问题。您可以使用 ObjectMapper 设置为默认时区

ObjectMapper mapper = ((MappingJackson2HttpMessageConverter) converter).getObjectMapper();
mapper.setTimeZone(TimeZone.getDefault());

这里的解决方案:Jackson @JsonFormat set date with one day less

完整的配置类:

@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());
        }
    }
}