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 :

[TimeZone] Gestion des fuseaux horaires


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 802
    Par défaut [TimeZone] Gestion des fuseaux horaires
    Je ne me suis jamais vraiment penché sur la gestion des fuseaux horaires en Java. Or j'ai maintenant un petit souci. Je n'arrive tout simplement pas à obtenir l'heure correspondant à un fuseau horaire quelconque.

    Par exemple, j'exécute ceci en local :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Calendar cal = Calendar.getInstance();
    cal.setTimeZone(TimeZone.getTimeZone("America/New_York"));
    Date maintenant = cal.getTime();
     
    System.out.println(DateUtils.toString(maintenant, new SimpleDateFormat("dd/MM/yyyy HH:mm")));
    J'obtiens l'heure locale au lieu de celle de New York.

    J'ai un peu cherché sur Internet et il semble que TimeZone doive être utilisé avec SimpleDateFormat, mais ça me parait complètement aberrant !! Et de toute façon j'ai aussi essayé et ça ne marche pas mieux :/

    Comment fait-on pour tout simplement obtenir l'heure actuelle correspondant à un fuseau horaire quelconque ?

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 802
    Par défaut
    Bon en fait j'ai posté mon message trop tôt car en continuant de chercher j'ai trouvé la réponse :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Calendar cal = Calendar.getInstance();
    TimeZone tz = TimeZone.getTimeZone("America/New_York");
    int offset = tz.getOffset(cal.getTimeInMillis());
    cal.add(Calendar.MILLISECOND, offset);

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 802
    Par défaut
    Je croyais avoir complètement résolut le problème, mais en essayant ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Calendar cal = Calendar.getInstance();
    TimeZone tz = TimeZone.getTimeZone("Europe/Paris");
    int offset = tz.getOffset(cal.getTimeInMillis());
    cal.add(Calendar.MILLISECOND, offset);
     
    Date maintenant = cal.getTime();
    Je n'obtiens pas tout à fait l'heure exacte. Il semble que l'heure obtenue corresponde plutôt à l'heure d'été :/

    Comment cela se fait-il ? Je tourne avec un JDK 1.6.

  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 verbose Voir le message
    Comment cela se fait-il ?
    Parce que getOffset() ne peut pas gérer les heures d'été ou d'hiver, puisqu'il ne sait pas si tu lui demandes pour l'heure d'été ou l'heure d'hiver.
    C'est pas comme ça qu'on fait. C'est vraiment à SimpleDateFormat qu'il faut filer une TimeZone.

    Citation Envoyé par verbose Voir le message
    J'ai un peu cherché sur Internet et il semble que TimeZone doive être utilisé avec SimpleDateFormat, mais ça me parait complètement aberrant !!
    C'est pourtant logique. Un instant dans le temps c'est un instant dans le temps. C'est le même qu'on soit à Paris, à New York, en Chine ou sur la Lune.

    Là où les différences apparaissent, c'est quand on commence à écrire ou prononcer ces instants dans le temps. Nous on dira qu'il est 21h, l'anglais qu'il est 20h, le new yorkais qu'il est 15h, et le lunien je sais pas. Mais ils parlent tous du même instant.
    Écrire ou prononcer l'heure, c'est le problème du SimpleDateFormat, donc c'est bien lui que la TimeZone intéresse.

    Citation Envoyé par verbose Voir le message
    Et de toute façon j'ai aussi essayé et ça ne marche pas mieux :/
    Si, mais encore faut-il le faire logiquement. Faire n'importe quoi tout en s'arrangeant pour qu'il y ait un SimpleDateFormat et un TimeZone dans l'histoire, ça ne suffit pas.
    Montre le code.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 394
    Par défaut
    Bonjour,

    Si tu veux convertir un Calendar en String dans la timeZone du calendar tu peux utiliser la fonction suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
        /**
         * Converti un Calendar en String au format spécifié, dans la timeZone du calendar
         * 
         * @param calendar Calendar à convertir
         * @param format Format dans lequel on veut convertir le Calendar
         * @return la date au format String, ou null si calendar = null;
         */
        public static String convertirCalendarEnString(Calendar calendar, String format)
        {
            String dateFormatee = null;
     
            if (calendar != null)
            {
                SimpleDateFormat formater = new SimpleDateFormat(format, Locale.FRANCE);
                formater.setTimeZone(calendar.getTimeZone());
                dateFormatee = formater.format(calendar.getTime());
            }
     
            return dateFormatee;
        }
    Romain.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 802
    Par défaut
    Merci pour vos réponses les gars.

    Je ne suis pas d'accord avec toi thelvin, un instant t est effectivement le même dans l'absolu, mais pas en relatif. Hors le constructeur de Calendar prend un TimeZone en paramètre, ce qui laisse penser que le Calendar représente un calendrier dans un référentiel relatif au fuseau horaire.

    De fait, en local, j'obtiens l'heure d'été alors qu'on est en hiver, mais sur mon serveur hébergé aux US, j'obtiens bien l'heure d'hiver à Paris.

    Je ne comprends pas d'où vient cette particularité, liée semble-t-il à l'exécution en local.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PHP 5.3] Gestion des fuseaux Horaires
    Par Anified dans le forum Langage
    Réponses: 3
    Dernier message: 23/06/2011, 14h57
  2. Gestion des decalages horaires en Java
    Par otam_otam dans le forum Langage
    Réponses: 1
    Dernier message: 09/11/2010, 19h22
  3. Gestion des fuseaux horaires(time.h et timezone)sous Linux
    Par adesport dans le forum Bibliothèque standard
    Réponses: 3
    Dernier message: 17/07/2008, 11h59
  4. [Timezone] Gestion des dates
    Par nezdeboeuf62 dans le forum GWT et Vaadin
    Réponses: 2
    Dernier message: 24/10/2007, 09h00
  5. Gestion des fuseaux horaires :-/
    Par kalash_jako dans le forum Général Conception Web
    Réponses: 9
    Dernier message: 23/04/2006, 23h02

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