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 :

Problème lors du calcul entre 2 dates


Sujet :

Collection et Stream Java

  1. #1
    Candidat au Club
    Inscrit en
    Mars 2010
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 2
    Points : 3
    Points
    3
    Par défaut Problème lors du calcul entre 2 dates
    Bonjour,

    J'avais besoin d'une fonction java qui me permettait de calculer le nombre de jour en 2 deux dates. Après une recherche sur Internet, j'avais trouvé ce code.

    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
    		// calcul du nombre de jours de la période
    		long CONST_DURATION_OF_DAY = 1000l * 60 * 60 * 24;
     
    		Calendar calendar1 = new GregorianCalendar();
    		calendar1.set(Calendar.YEAR, Integer.parseInt(getDECOMPTE_PERIODE_DEBUT().getData().substring(4,8)));
    		calendar1.set(Calendar.MONTH, Integer.parseInt(getDECOMPTE_PERIODE_DEBUT().getData().substring(2,4))-1);
    		calendar1.set(Calendar.DAY_OF_MONTH, Integer.parseInt(getDECOMPTE_PERIODE_DEBUT().getData().substring(0,2)));
    		Date date1 = calendar1.getTime();
     
    		Calendar calendar2 = new GregorianCalendar();
    		calendar2.set(Calendar.YEAR, Integer.parseInt(getDECOMPTE_PERIODE_FIN().getData().substring(4,8)));
    		calendar2.set(Calendar.MONTH, Integer.parseInt(getDECOMPTE_PERIODE_FIN().getData().substring(2,4))-1);
    		calendar2.set(Calendar.DAY_OF_MONTH, Integer.parseInt(getDECOMPTE_PERIODE_FIN().getData().substring(0,2)));
     
    		Date date2 = calendar2.getTime();
     
     
    		// Différence
    		long diff = Math.abs(date2.getTime() - date1.getTime());
    		long numberOfDay = (long)diff/CONST_DURATION_OF_DAY;
    Celui-ci marche parfaitement sauf pour le mois de mars. Si j'indique du 1er au 31 mars 2010, la fonction me retourne 29 jours au lieu des 30 jours. J'imagine que c'est un problème de millisecondes.

    Quelqu'un a-t-il eu le même problème ?

    Merci d'avance pour toutes réponses.

    B. Mathieu

  2. #2
    Membre confirmé Avatar de Katachana
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    755
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2007
    Messages : 755
    Points : 503
    Points
    503
    Par défaut
    Bonjour,

    Pour les manipulations de la sorte je te conseil d'utiliser la librairie joda-time. Ca sera beaucoup plus directe

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      Days d = Days.daysBetween(startDate, endDate);
      int days = d.getDays();
    ou encore

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     Period p = new Period(startDate, endDate);
    int numOfDays = p.getDays() ;
    En entrée tu auras des dates exprimées en millisecondes

  3. #3
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par thesmall1985 Voir le message
    Celui-ci marche parfaitement sauf pour le mois de mars. Si j'indique du 1er au 31 mars 2010, la fonction me retourne 29 jours au lieu des 30 jours. J'imagine que c'est un problème de millisecondes.
    Un problème d'heure, en fait. À cause du changement d'heure, tous les jours ne font pas 24 heures. Dans la nuit au début du 28 Mars 2010, il y a le passage de l'heure d'hiver à l'heure d'été. Ce jour ne fait que 23 heures.
    Il te manque donc une heure pour compter tous tes jours.

    Ceci est la raison pour laquelle, quand on veut compter des jours, ce n'est pas forcément une bonne idée de le faire à partir de la différence en millisecondes. Suivant les cas, il vaut mieux utiliser un Calendar et faire la différences des années, et des DAY_IN_YEAR.

    (À noter qu'en théorie et de la même manière, toutes les minutes ne font pas 60 secondes. Mais pour des raisons pratiques, ni Java, ni la plupart des environnements, ne gèrent les secondes intercalaires.)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    heu si java.util.Date et Calendar gèrent les secondes intercalaires

    A second is represented by an integer from 0 to 61; the values 60 and 61 occur only for leap seconds and even then only in Java implementations that actually track leap seconds correctly. Because of the manner in which leap seconds are currently introduced, it is extremely unlikely that two leap seconds will occur in the same minute, but this specification follows the date and time conventions for ISO C.
    Mais en pratique, ca nécessite une implémentation jvm qui le fait aussi, ce qui n'est pas le cas de celle de sun

  5. #5
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Je le savais mais je voulais rester simple.

    Bref, dans le cas où on pense possible que le programme soit un jour exécuté par une JVM qui gère les secondes intercalaires,
    alors il ne faut pas penser que toutes les minutes font 60 secondes. (Ça peut aller de 58 à 62 secondes en théorie, et personnellement je compterais pas sur une limite en-dessous de 100.)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    oui je précisais, de toutes facons entre une leap seconde et 1 heure à cause du changement été/hiver, l'exemple est simple pour montrer que se baser sur les millisecondes pour mesure une différence de dates, c'est une mauvais plan. Sans parler de certaines timezones ou, à l'approche de l'an 2000, ils ont carrément "sauté" 24h pour passer de GMT-11 à GMT+13


    Les dates sont tout sauf un système mathématique simple

  7. #7
    Candidat au Club
    Inscrit en
    Mars 2010
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    Merci pour toutes vos réponses. J'ai pensé que le "problème" venait du changement d'horaire. J'ai essayé de trouver ma solution dans le timezone.

    J'ai ajouté ceci aux deux dates et cela fonctionne. Mars a bel et bien 31 jours. Je lui force le timezone.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    calendar1.setTimeZone(TimeZone.getTimeZone("GMT"));
    calendar2.setTimeZone(TimeZone.getTimeZone("GMT"));
    Je pense que la solution n'est pas très catholique mais elle a l'air de fonctionner. Enfin j'espère que cela n'occasionnera pas d'autres problèmes de calcul.

    En tout cas merci à tous.

    B. Mathieu

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

Discussions similaires

  1. Problème calcul entre 2 dates
    Par all06 dans le forum SQL
    Réponses: 4
    Dernier message: 06/01/2014, 17h11
  2. Problème de calcul entre 2 dates
    Par Emeline1989 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 16/04/2010, 09h30
  3. Problème sur calcul entre 2 dates
    Par kcizth dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 08/10/2008, 19h17
  4. [Oracle8] calcul entre 2 dates
    Par bobunny dans le forum Oracle
    Réponses: 7
    Dernier message: 28/10/2005, 12h18
  5. Calcul entre deux dates heures
    Par Isa31 dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 31/03/2005, 13h17

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