21

在客户端,我使用 dd/MM/yyyy 日期格式。该字段使用 twitter bootstrap 3 日期时间选择器 ( https://eonasdan.github.io/bootstrap-datetimepicker/ )

我通过 twitter bootstrap 3 datetime picker 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

一天失去了。

有什么解释吗?

4

5 回答 5

13

根据JacksonFAQDateHandling页面:

Jackson 构造的所有与 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()打印日期。请注意,javaDate类与时区无关,但其方法在打印前toString()使用系统的默认时区。

这里看起来24/07/2015 00:00 UTC正在转换为23/07/2015 19:00 ESTby toString()。这两个都代表相同的时间点,但在不同的时区。

于 2015-07-27T16:22:27.080 回答
1

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

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

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

spring.jackson.time-zone:EST

于 2018-12-07T18:48:11.990 回答
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
于 2020-04-09T20:10:52.150 回答
0

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

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

此处的解决方案:Jackson @JsonFormat 设置日期少一天

全配置类:

@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());
        }
    }
}
于 2020-12-28T08:27:06.993 回答
0

有同样的问题。使用邮递员验证客户端不是罪魁祸首。杰克逊使用的时区与系统的时区似乎存在问题。不得不更改杰克逊配置以补偿日期

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

}
于 2019-01-14T15:43:25.793 回答