jackson 错过一天的约会

0vvn1miw  于 2022-11-09  发布在  其他
关注(0)|答案(6)|浏览(133)

在客户端,我使用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
一天就丢了。
有解释吗?

y4ekin9u

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()**修复了它。

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

console.log(mydate.toUTCString());

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

1aaf6o9v2#

我在java中也遇到过同样的问题。

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

nfg76nw03#

这周我也遇到了同样的问题。对我们来说,问题是我们使用的解码器。我们的项目使用feing,我们使用JacksonDecoder来解码JSON,所以我们改用GsonDecoder,这样问题就解决了。

private fun servico(): IUsuarioServiceDeskClient {
    return Feign.builder()
        .options(Request.Options(240000, 240000))
        .client(ApacheHttpClient()) 
        .encoder(JacksonEncoder())
        .decoder(GsonDecoder())
        .errorDecoder(SincServiceDeskErrorDecoder(urlBase))
        .target(IUsuarioServiceDeskClient::class.java, urlBase)
}
qgzx9mmu

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)
中所述]:

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

其次,我认为您使用Date.toString()来打印日期。Note java Date类是独立于时区的,但它的toString()方法在打印前使用系统的 * 默认 * 时区。
这里看起来像是24/07/2015 00:00 UTCtoString()转换成23/07/2015 19:00 EST,这两个都代表同一个时间点,但是在不同的时区。

ws51t4hk

ws51t4hk5#

AimZ的答案是我的答案,但我将这三行添加到我的application.properties文件中,并实现了同样的效果
日期格式=年-月-日
spring.jackson.序列化.将日期作为时间戳写入:false
spring.jackson.时区:美国东部时间

oaxa6hgo

oaxa6hgo6#

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

}

相关问题