问题
On client side, i use dd/MM/yyyy date format. The field use a twitter bootstrap 3 datetime picker (https://eonasdan.github.io/bootstrap-datetimepicker/)
I enter via twitter bootstrap 3 datetime picker 24/07/2015
in my json i sent, i see: birthdate: "24/07/2015"
In my dto, i do
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd/MM/yyyy")
private Date birthdate;
When i receive the date on the server, in my dto see: 23/07/2015 19:00
One day is lost.
Any explication?
回答1:
According to JacksonFAQDateHandling page:
All time objects that have associated TimeZone (java.util.Calendar etc) that Jackson constructs use the standard timezone (GMT), not the local time zone (whatever that might be). That is: Jackson defaults to using GMT for all processing unless specifically told otherwise.
In your case, it looks like the date is automatically being converted to GMT/UTC. Try to provide your local timezone explicitly to avoid UTC conversion [as mentioned in the question How come this time is off by 9 hours? (5 hours, 3 hours etc) on same page]:
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="dd/MM/yyyy", timezone="EST")
Secondly, I think you are using Date.toString()
to print date. Note that java Date
class is timezone independent but its toString()
method uses the system's default timezone before printing.
Here it looks like 24/07/2015 00:00 UTC
is being converted to 23/07/2015 19:00 EST
by toString()
. Both of these represent the same moment of time but in different timezones.
回答2:
AimZ answer is what pointed me to this but I added these three lines to my application.properties file and achieved the same thing
spring.jackson.date-format=yyyy-MM-dd
spring.jackson.serialization.write-dates-as-timestamps:false
spring.jackson.time-zone:EST
回答3:
Had the same issue. Using postman to verify that the client is not the culprit. Seems like an issue with the timezone Jackson is using vs the timezone of the system. Had to change the Jackson config to compensate for dates
@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;
}
}
来源:https://stackoverflow.com/questions/31622254/lost-one-day-for-a-date