2015-07-25 1 views
8

Du côté client, j'utilise le format de date jj/MM/aaaa. Le champ utilise un programme de démarrage twitter 3 sélecteur datetime (https://eonasdan.github.io/bootstrap-datetimepicker/)perdu un jour pour une date

I entrer via twitter bootstrap 3 sélecteur datetime 24/07/2015
dans mon JSON j'ai envoyé, je vois: date de naissance: "24/07/2015"

dans mon DTO, je ne

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

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

Un jour est perdu.

Une explication?

+0

Avez-vous vérifié vos paramètres d'heure locale sur votre système? – Sam

+0

client/serveur est sur la même machine: les deux sont edt -4 heures (temps mtl) ... –

+1

Il est certainement un problème de traduction de fuseau horaire. Un côté traite l'heure comme UTC et l'autre convertit en heure locale. Nous avons eu ce problème dans une intégration client/serveur avec un système tiers. Le cadeau mort est le "19:00" qui a été ajouté à l'autre temps, il est exactement 5 heures de différence (pas réellement une journée complète). – mellamokb

Répondre

7

Selon JacksonFAQDateHandling page:

Tous les objets de temps qui ont associés TimeZone (java.util.Calendar etc) qui construit Jackson utilisation le fuseau horaire standard (GMT), pas la locale fuseau horaire (quel qu'il soit). C'est-à-dire: Jackson utilise par défaut en utilisant GMT pour tous les traitements sauf indication contraire de.

Dans votre cas, il semble que la date soit automatiquement convertie en GMT/UTC. Essayez de fournir explicitement votre fuseau horaire local pour éviter la conversion UTC [comme mentionné dans la question Comment se fait-il que cette heure soit décalée de 9 heures? (5 heures, 3 heures, etc.) sur une 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. Note que la classe java Date 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 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.

+0

je n'utilise pas toString(), mais sûrement quand @JsonFormat (shape = JsonFormat.Shape.STRING, pattern = "jj/MM/aaaa"), toString est peut-être appelé. Existe-t-il une solution standard pour gérer cela? Gardez seulement la date gmt ... mais vous devez connaître le fuseau horaire de l'utilisateur pour afficher la date correctement. Peut-être que quelque chose pourrait être utilisé avec la nouvelle date de java 8 ou joda? –

+0

La meilleure pratique consiste à stocker les informations de date/heure dans UTC dans la base de données et également à stocker le fuseau horaire de l'utilisateur. Utilisez ensuite ce fuseau horaire lors de l'affichage des dates à l'utilisateur ou supprimez le décalage horaire avant de le stocker.Il existe de nombreux articles énumérant les avantages de cette approche, c'est-à-dire que l'application peut prendre en charge différents fuseaux horaires. Java8 Date API a fourni un nouvel ensemble de classes pour travailler avec date/heure. Voici un bel article sur Java8 Date API https://dzone.com/articles/deeper-look-java-8-date-and. Java8 ou Joda simplifie la gestion de la date et du fuseau horaire. – AimZ

+0

Cela fonctionne pour moi. Merci. – Elvermg