IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

Problème de décalage horaire avec un Calendar


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 53
    Par défaut Problème de décalage horaire avec un Calendar
    Bonjour

    Je rencontre un pb avec les Calendar de Java.

    Dans mon appli, je reçois une date d'un système externe. Cette date est récupérée sous forme de Calendar.
    Or, je me rends compte que les champs ne correspondent pas à l'heure exacte reçue.
    On voit dans la trace suivante que "HOUR_OF_DAY=15,MINUTE=56,SECOND=39". Or, lorsque je formate la date pour l'afficher j'obtiens "16:56:39"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    maDate = java.util.GregorianCalendar[time=1323446199105,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo
    [id="GMT",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=2,minimalDaysInFirstWeek=4,ERA=1,
    YEAR=2011,MONTH=11,WEEK_OF_YEAR=49,WEEK_OF_MONTH=2,DAY_OF_MONTH=9,DAY_OF_YEAR=343,DAY_OF_WEEK=6,
    DAY_OF_WEEK_IN_MONTH=2,AM_PM=1,HOUR=3,HOUR_OF_DAY=15,MINUTE=56,SECOND=39,MILLISECOND=105,ZONE_OFFSET=0,DST_OFFSET=0]
    maDate time = 1323446199105
    maDateFormattee = 09-12-2011 16:56:39
    Cela me pose un problème car je dois modifier cette heure à 20h.
    Or, lorsque je positionne l'heure à 20h avec "maDate.set(Calendar.HOUR_OF_DAY, 20);"
    j'obtiens également 1h de décalage, et l'heure affichée est 21h.

    Pour quelle raison y a-t-il une heure de décalage entre l'heure affichée et le Calendar ?
    Est-ce du aux locales ?...
    Comment peut-on récupérer ce décalage pour ajuster l'heure que je vais positionner ? Visiblement, l'offset du TimeZone est à 0... Je ne peux donc même pas me baser dessus...

    Merci d'avance pour votre aide.

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par flexx Voir le message
    Est-ce du aux locales ?...
    Les locales, aucune chance, mais à mon avis c'est dû aux time zones.

    Dans ton exemple on voit que tu as configuré ton Calendar pour utiliser GMT.
    Je suis prêt à parier que tu n'as pas fait la même chose pour ton DateFormat, ce qui fait qu'il utilise la TimeZone par défaut, ce qui chez nous, à l'heure d'hiver, est GMT+1

    Citation Envoyé par flexx Voir le message
    Comment peut-on récupérer ce décalage pour ajuster l'heure que je vais positionner ?
    Utilise la même TimeZone dans ton Calendar et dans ton DateFormat.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 53
    Par défaut
    Merci pour ta réponse.

    En fait, maintenant, pour afficher la date, j'utilise tout simplement la classe Date : maDate.getTime().toString()


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    maDate = java.util.GregorianCalendar[time=1323451647070,areFieldsSet=true,areAllFeldsSet=true,lenient=true,
    zone=sun.util.calendar.ZoneInfo[id="GMT",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=2,
    minimalDaysInFirstWeek=4,ERA=1,YEAR=2011,MONTH=11,WEEK_OF_YEAR=49,WEEK_OF_MONTH=2,DAY_OF_MONTH=9,DAY_OF_YEAR=343,
    DAY_OF_WEEK=6,DAY_OF_WEEK_IN_MONTH=2,AM_PM=1,HOUR=5,HOUR_OF_DAY=17,MINUTE=27,SECOND=27,MILLISECOND=70,ZONE_OFFSET=0,DST_OFFSET=0]
     
    maDate = Fri Dec 09 18:27:27 CET 2011
     
    TimeZone = TimeZone = sun.util.calendar.ZoneInfo[id="GMT",offset=0,dstSavings=0,useDalight=false,transitions=0,lastRule=null]
    On voit donc toujours que "HOUR_OF_DAY=17,MINUTE=27,SECOND=27"
    alors que la date est "Fri Dec 09 18:27:27 CET 2011"

    Le TimeZone montre un offset à 0.
    Je ne sais pas comment faire pour récupérer le décalage (à part faire une bidouille pour comparer l'heure récupérée avec Date et l'heure présente dans HOUR_OF_DAY...).

    Par contre, en local sur ma machine, quand je fais des tests avec la classe Calendar, j'obtiens un "ZoneInfo[id="Europe/Paris",offset=3600000,..." avec un offset d'une heure. Mais pas sur le serveur...


    Edit :

    Je viens de faire un nouveau test en mettant la date de mon serveur au 1er Juiller à 13h. On est donc en heure d'été.

    J'obtiens ceci :
    maDate = java.util.GregorianCalendar[time=1311161769991,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo
    [id="GMT",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=2,minimalDaysInFirstWeek=4,ERA=1,YEAR=2011,MONTH=6,
    WEEK_OF_YEAR=29,WEEK_OF_MONTH=3,DAY_OF_MONTH=20,DAY_OF_YEAR=201,DAY_OF_WEEK=4,DAY_OF_WEEK_IN_MONTH=3,
    AM_PM=0,HOUR=11,HOUR_OF_DAY=11,MINUTE=36,SECOND=9,MILLISECOND=991,ZONE_OFFSET=0,DST_OFFSET=0]

    et maDate = Wed Jul 20 13:36:09 CEST 2011

    On retrouve donc une différence de 2h en heure d'été, et 1h en heure d'hiver.

    Je voudrais donc juste savoir comment récupérer ce décalage horaire automatiquement à partir du TimeZone (ou du Calendar).
    Parce que là j'ai que des offset à 0...

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par flexx Voir le message
    En fait, maintenant, pour afficher la date, j'utilise tout simplement la classe Date : maDate.getTime().toString()
    Ça marchera pas. Cette méthode utilise toujours la TimeZone par défaut, puisqu'il n'y a pas moyen de lui en donner une autre.
    Utilise un SimpleDateFormat pour afficher ta date.

    Citation Envoyé par flexx Voir le message
    Je voudrais donc juste savoir comment récupérer ce décalage horaire automatiquement à partir du TimeZone (ou du Calendar).
    Calendar a une méthode getTimeZone() qui renvoie la TimeZone utilisée par le Calendar.
    DateFormat a une méthode setTimeZone(TimeZone zone) qui permet d'indiquer la TimeZone dans laquelle on veut afficher les dates.
    Je laisse à l'exercice de ton imagination comment relier ces deux états de fait.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 53
    Par défaut
    Alors, finalement, je m'en suis sorti en créant un nouveau Calendar à partir de l'ancien et en changeant l'heure de ce nouveau Calendar.

    Apparemment, pas mal de gens ont eu des problèmes similaires avec les Calendar et m'ont conseillé d'utiliser joda-time.

    Merci en tous les cas pour votre aide

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par flexx Voir le message
    Alors, finalement, je m'en suis sorti en créant un nouveau Calendar à partir de l'ancien et en changeant l'heure de ce nouveau Calendar.
    Ou tu aurais pu faire ce que j'ai dit, qui fonctionne parfaitement et ne nécessite aucun bricolage.

    Citation Envoyé par flexx Voir le message
    Apparemment, pas mal de gens ont eu des problèmes similaires avec les Calendar et m'ont conseillé d'utiliser joda-time.
    Il n'y a aucun problème, juste des gens qui ne veulent pas comprendre ce qu'on passe notre temps à leur dire. Ni lire la JavaDoc des classes impliquées.

    Certes joda-time est une bibliothèque plus simple que la lib de base Java, pour gérer les dates et heures. Il y a de nombreux cas d'utilisation pour lesquels elle est extra.

    Mais dans notre cas très précis, "plus simple" signifie "moins rigoureux", ce qui n'est pas franchement digne d'un programmeur.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. [HTML] Problème de Décalage body avec ancre html.
    Par bobomasterflash dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 13/12/2007, 08h50
  2. problème décalage horaire
    Par Blo0d4x3 dans le forum Administration système
    Réponses: 2
    Dernier message: 09/08/2007, 18h33
  3. problème avec mon Calendar
    Par skorpio dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 06/07/2007, 11h27
  4. problème avec le calendar
    Par sky_perrinos dans le forum Langage
    Réponses: 1
    Dernier message: 25/03/2007, 17h45
  5. [Calendar] Problème de décalage du numéro de semaine
    Par Amara dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 10/07/2006, 16h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo