在客户端,我使用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
有一天失踪。
任何解释?
答案 0 :(得分:12)
具有关联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 UTC
被23/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());
}
}
}