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

Collection et Stream Java Discussion :

Petit problème de gestion de Date et de TimeZone


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2006
    Messages : 23
    Par défaut Petit problème de gestion de Date et de TimeZone
    Bonjour,

    Je dois effectuer des comparaisons de dates, mais cela devient plus ardu dès que je veux changer le TimeZone. J'espère que des personnes un peu plus expérimentées dans ce domaine pourront répondre à cette épineux problème.

    Voici quelqu’un des tests que j’ai déjà réalisés (la date utilisée pour les tests est le 09/05/06 à 11H10 et 53 secondes et les TimeZones sont GMT+0 et GMT+2).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Calendar cal1 = Calendar.getInstance(tz1);
    cal1.set(_year, _month, _day, _hour, _minute, _second);
    Date date1 = cal1.getTime();
     
    Calendar cal2 = Calendar.getInstance(tz2);
    cal2.set(_year, _month, _day, _hour, _minute, _second);
    Date date2 = cal2.getTime();
     
    System.out.println("1 - date1 : " + date1 + " (Calendar.HOUR : " + cal1.get(Calendar.HOUR_OF_DAY) + " - " + cal1.getTimeInMillis() + ")");
    System.out.println("2 - date2 : " + date2 + " (Calendar.HOUR : " + cal2.get(Calendar.HOUR_OF_DAY) + " - " + cal2.getTimeInMillis() + ")");
    System.out.println("3 - comparaison : " + (date1.getTime() == date2.getTime()) + " --> attendu : false");
    		System.out.println("4 - TimeZone : " + cal1.getTimeZone().getDisplayName() + " et " + cal2.getTimeZone().getDisplayName());
    Sortie console :
    1 - date1 : Tue May 09 13:10:53 CEST 2006 (Calendar.HOUR : 11 - 1147173053549)
    2 - date2 : Tue May 09 11:10:53 CEST 2006 (Calendar.HOUR : 11 - 1147165853549)
    3 - comparaison : false --> attendu : false
    4 - TimeZone : GMT+00:00 et GMT+02:00
    L’inconvénient ici, est que je donne bien 11h dans les deux cas, mais qu’à l’affichage, j’ai 11H et 13H. Les dates ne sont bien évidemment pas identique.


    J’ai remarqué qu’en indiquant le TimeZone après l’appel d’un getTime(), le résultat était différent

    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
    cal1 = Calendar.getInstance();
    cal1.set(_year, _month, _day, _hour, _minute, _second);
    date1 = cal1.getTime();
    cal1.setTimeZone(tz1);
    date1 = cal1.getTime();
     
    cal2 = Calendar.getInstance();
    cal2.set(_year, _month, _day, _hour, _minute, _second);
    date2 = cal2.getTime();
    cal2.setTimeZone(tz2);
    date2 = cal2.getTime();
     
    System.out.println("1 - date1 : " + date1 + " (Calendar.HOUR : " + cal1.get(Calendar.HOUR_OF_DAY) + " - " + cal1.getTimeInMillis() + ")");
    System.out.println("2 - date2 : " + date2 + " (Calendar.HOUR : " + cal2.get(Calendar.HOUR_OF_DAY) + " - " + cal2.getTimeInMillis() + ")");
    System.out.println("3 - comparaison : " + (date1.getTime() == date2.getTime()) + " --> attendu : true");
    System.out.println("4 - TimeZone : " + cal1.getTimeZone().getDisplayName() + " et " + cal2.getTimeZone().getDisplayName());

    La sortie console est la suivante :
    1 - date1 : Tue May 09 11:10:53 CEST 2006 (Calendar.HOUR : 9 - 1147165853926)
    2 - date2 : Tue May 09 11:10:53 CEST 2006 (Calendar.HOUR : 11 - 1147165853926)
    3 - comparaison : true --> attendu : true
    4 - TimeZone : GMT+00:00 et GMT+02:00
    Ici, le résultat est tout autre !
    Dans les deux cas, j’ai bien 11H (ce que je souhaitais au départ), mais lors de la comparaison, il considère que les dates sont les mêmes. Alors, que dans la réalité, il est bien 11H dans les deux cas, mais en GMT+0 et en GMT+2.

    Ma question est simple, comment faire pour avoir la date spécifié indépendamment du GMT (si je rentre 11H, je veux voir s’afficher 11H que ce soit en GMT+0 et GMT+2).
    Et je souhaite pouvoir faire des comparaisons de dates (11H GMT+0 != 11H GMT+2)

    Merci d’avance d’éclairer ma lanterne

  2. #2
    Membre Expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Par défaut
    Depuis que je connais Joda-Time je ne jure que par cette API pour les manipulations de dates, je ne saurais que trop te conseiller de l'utiliser (d'autant plus qu'elle sera vraisemblablement intégrée à Java7 car l'implémentation et les performances sont bien meilleures que le système actuel).

  3. #3
    Rédacteur

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2006
    Messages : 23
    Par défaut
    Citation Envoyé par natha Voir le message
    Depuis que je connais Joda-Time je ne jure que par cette API pour les manipulations de dates, je ne saurais que trop te conseiller de l'utiliser (d'autant plus qu'elle sera vraisemblablement intégrée à Java7 car l'implémentation et les performances sont bien meilleures que le système actuel).
    Merci pour cette réponse, mais le problème, c'est que le contexte est particulier. A ce niveau du projet, je ne peux plus ajouter de nouvelles API. Je dois donc me débrouiller avec ce que j'ai (donc Calendar, Date et TimeZone)

    Quelqu'un aurait-il une autre idée?

  4. #4
    Membre Expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Par défaut
    Citation Envoyé par Remi Masson Voir le message
    je ne peux plus ajouter de nouvelles API
    Arf... alors dommage désolé. Je ne peux pas t'aider

  5. #5
    Membre émérite
    Avatar de divxdede
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    525
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2004
    Messages : 525
    Par défaut
    11h en GMT+0 est effectivement différent de 11h en GMT+2
    Tu ne peut rien faire contre ca.

    Si tu veux ignorer la notion de "timezone", assure toi de toujours être dans la même timezone lors de la construction des tes dates.

  6. #6
    Rédacteur

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2006
    Messages : 23
    Par défaut
    Citation Envoyé par divxdede Voir le message
    11h en GMT+0 est effectivement différent de 11h en GMT+2
    Tu ne peut rien faire contre ca.

    Si tu veux ignorer la notion de "timezone", assure toi de toujours être dans la même timezone lors de la construction des tes dates.
    Justement, c'est bien la tout le problème. Nous sommes bien d'accord, 11H en GMT+0 et GMT+2, c'est belle et bien différent.
    Mais, à priori, Java n'est pas tout à fait d'accord avec ca (cf. 2ème exemple).

    C'est bien la tout monde problème, car évidement, je dois travailler avec les TimeZone (sinon, il n'y aurait aucun plaisir)

  7. #7
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,



    Je ne comprend pas trop ton problème. Pour moi tout me semble logique.

    Dans le premier cas tu crées deux dates dans deux fuseaux horaires différents (mêmes années/mois/jours/etc. mais fuseaux différents), donc tu as bien deux objets dates différents.


    Dans le second cas tu crées deux dates strictements identiques (mêmes infos et même fuseaux - celui par défaut).
    Le fait de changer le fuseau horaire par la suite ne modifie pas la valeur de la date mais seulement son affichage.


    Citation Envoyé par Remi Masson Voir le message
    Ma question est simple, comment faire pour avoir la date spécifié indépendamment du GMT (si je rentre 11H, je veux voir s’afficher 11H que ce soit en GMT+0 et GMT+2).
    Et je souhaite pouvoir faire des comparaisons de dates (11H GMT+0 != 11H GMT+2)
    Les objets de type Date ne comporte aucune information sur le TimeZone, mais représentent seulement une date GMT. Ce n'est que lors de l'affichage qu'une conversion est faite (en utilisant le timezone courant par défaut).


    Donc la solution serait d'utiliser un DateFormat et de spécifier le timezone avant chaque affichage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	DateFormat df = DateFormat.getDateTimeInstance();
     
    	df.setTimeZone(cal1.getTimeZone());
    	System.out.println( df.format(cal1.getTime()) );
     
    	df.setTimeZone(cal2.getTimeZone());
    	System.out.println( df.format(cal2.getTime()) );

    a++

  8. #8
    Rédacteur

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2006
    Messages : 23
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Dans le second cas tu crées deux dates strictements identiques (mêmes infos et même fuseaux - celui par défaut).
    Le fait de changer le fuseau horaire par la suite ne modifie pas la valeur de la date mais seulement son affichage.
    Oui, les dates sont strictement identiques. Mais en changeant le TimeZone, on voit bien que l'heure dans le Calendar est modifié (le GMT+0 passe à 9H au lieu de 11).

    Ce qui ne m'explique pas tout à fait pourquoi, il considère que ce sont deux dates différentes.

    De plus, le problème du changement de TimeZone se pose différement s'il est appelé après ou avant le getTime (ici après).

    Je vais tout de même voir ce que je peux faire avec le DateFormat, mais à priori, ca risque de ne pas convenir (oui, je travaille sur un projet qui a pas mal de contrainte )

    Merci pour la réponse

    Si d'autres personnes ont d'autres explications ou solutions, je suis également preneur

    Merci

Discussions similaires

  1. [MySQL] probléme de gestion des dates
    Par nedalnedal dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 12/04/2012, 14h12
  2. petit problème avec le type DATE
    Par miage2 dans le forum Requêtes
    Réponses: 2
    Dernier message: 31/01/2010, 00h38
  3. Problème de gestion de date
    Par bruce207 dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 20/05/2008, 12h26
  4. Réponses: 6
    Dernier message: 12/07/2006, 12h54
  5. [XSL] gestion de dates, date plus petite qu'une autre.
    Par Caille Rotie dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 23/01/2006, 11h01

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