web-dev-qa-db-fra.com

perdu un jour pour une date

Du côté client, j'utilise le format de date jj/mm/aaaa. Le champ utilise un sélecteur de date et d’heure Twitter bootstrap 3 ( https://eonasdan.github.io/bootstrap-datetimepicker/ )

J'entre par l'intermédiaire de Twitter bootstrap 3 datetime picker 24/07/2015
Dans mon message json j’ai envoyé, je vois: date de naissance: "24/07/2015"

Dans mon dto je fais

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd/MM/yyyy")
private Date birthdate;

Quand je reçois la date sur le serveur, dans mon dto voir: 23/07/2015 19:00

Un jour est perdu.

Une explication?

12
robert trudel

Selon JacksonFAQDateHandling page:

Tous les objets temporels auxquels TimeZone (Java.util.Calendar Etc) est associé et que Jackson construit use le fuseau horaire standard (GMT), not the fuseau horaire local (quel qu'il soit). C'est-à-dire que Jackson utilise par défaut En utilisant l'heure GMT pour tout traitement sauf si le contraire.

Dans votre cas, il semblerait que la date soit automatiquement convertie en GMT/UTC. Essayez d’indiquer explicitement votre fuseau horaire local pour éviter la conversion en UTC [comme indiqué dans la question comment se fait-il que cette heure est décalée de 9 heures? (5 heures, 3 heures, etc.)} sur la même page]:

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

Deuxièmement, je pense que vous utilisez Date.toString() pour imprimer la date. Remarque La classe Date de Java est indépendante du fuseau horaire, mais sa méthode toString() utilise le fuseau horaire par défaut du système avant l'impression.

Ici, il semble que 24/07/2015 00:00 UTC est en train d'être converti en 23/07/2015 19:00 EST par toString(). Les deux représentent le même {moment} du temps, mais dans des fuseaux horaires différents.

11
AimZ

Avait le même problème. Utiliser postman pour vérifier que le client n’est pas le coupable. Cela ressemble à un problème de fuseau horaire que Jackson utilise par rapport au fuseau horaire du système. Devait changer la configuration de Jackson pour compenser les 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;
    }

}
0
Chrispie

AimZ répond, c’est ce qui m’a amené à cela, mais j’ai ajouté ces trois lignes à mon fichier application.properties et obtenu le même résultat

spring.jackson.date-format = aaaa-MM-jj

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

spring.jackson.time-zone: EST

0