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 :

Calculer le nombre de mois entre 2 dates


Sujet :

Collection et Stream Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 19
    Points : 17
    Points
    17
    Par défaut Calculer le nombre de mois entre 2 dates
    Bonjour
    J'aurais besoin de calculer le nombre de mois plein entre 2 dates:
    Par exemple entre 2/3/2007 et 3/1/2007 ==> 1 mois
    entre 3/3/2007 et 3/1/2007 ===> 2 mois
    Existe t'il une fonction java qui le fait directement en passant les 2 dates en paramètres du style MONTHS_BETWEEN sous ORACLE

    merci

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    429
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 429
    Points : 475
    Points
    475
    Par défaut
    Bonjour,

    En supposant que les dates sont de la forme jour/mois/année, et que la première est toujours inférieur à la seconde...

    Nicolas

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    // appeler le fichier Test.java
    // par Nicolas_75
    // lundi 19 février 2007
     
    import java.text.SimpleDateFormat;
    import java.util.*;
     
    public class Test {
     
        public static int nbOfMonthsBetweenTwoDates(String dateString1, String dateString2) throws Exception  {
            SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
            Date date1 = sdf.parse(dateString1);
            GregorianCalendar gc1 = new GregorianCalendar();
            gc1.setTime(date1);
            Date date2 = sdf.parse(dateString2);
            GregorianCalendar gc2 = new GregorianCalendar();
            gc2.setTime(date2);
            int gap = 0;
            gc1.add(GregorianCalendar.MONTH, 1);
            while(gc1.compareTo(gc2)<=0) {
                gap++;
                gc1.add(GregorianCalendar.MONTH, 1);
            }
            return gap;
        }
     
        public static void main(String[] args) {
            try {
                System.out.println(nbOfMonthsBetweenTwoDates("3/1/2007", "2/4/2007")+" mois");
            } catch (Exception e) { e.printStackTrace(); }    
        }
    }

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 19
    Points : 17
    Points
    17
    Par défaut
    Bonsoir
    Ca marche, merci

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    429
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 429
    Points : 475
    Points
    475
    Par défaut
    Je t'en prie.

  5. #5
    Membre averti Avatar de danyboy85
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2005
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2005
    Messages : 548
    Points : 312
    Points
    312
    Par défaut
    Mouai, ça marchotte...

    Si :
    date1 = "01/03/2010"
    date2 = "31/03/2010"

    --> gap = 0

    Si :
    date1 = "01/03/2010"
    date2 = "31/04/2010"

    --> gap = 2


    Tout ceci n'est pas logique. Si entre le premier jour et le dernier jour du mois la fonction retourne 0 mois, alors elle devrait retourner 1 mois entre le premier jour du mois et le dernier jour du mois suivant.
    E clair je devrais avoir comme résultat 0 puis 1 ou 1 puis 2, mais pas 0 et 2.

  6. #6
    Membre averti Avatar de Bezout
    Profil pro
    Développement
    Inscrit en
    Septembre 2003
    Messages
    234
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Développement

    Informations forums :
    Inscription : Septembre 2003
    Messages : 234
    Points : 305
    Points
    305
    Par défaut
    Et un truc aussi con que ca :

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    		SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");
     
    		Date dateA = df.parse("01/05/2010");
    		Date dateB = df.parse("25/09/2010");
     
    		long diffMs = dateB.getTime() - dateA.getTime();
     
    		System.out.printf("En milli-secondes : %d\n", diffMs);
    		System.out.printf("En secondes : %f\n", (double)diffMs/1000);
    		System.out.printf("En minutes : %f\n", (double)diffMs/1000/60);
    		System.out.printf("En heures : %f\n", (double)diffMs/1000/60/60);
    		System.out.printf("En jours : %f\n", (double)diffMs/1000/60/60/24);
    		System.out.printf("En mois : %f\n", (double)diffMs/1000/60/60/24/30);

    avec le résultat suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    En milli-secondes : 12700800000
    En secondes : 12700800,000000
    En minutes : 211680,000000
    En heures : 3528,000000
    En jours : 147,000000
    En mois : 4,900000

  7. #7
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 560
    Points : 21 622
    Points
    21 622
    Par défaut
    Ouaip. Personnellement, ce que je ferais dépendrait du résultat précisément attendu (par exemple, zéro mois entre le début du mois et la fin du mois, bof bof. 1 mois entre le dernier jour du mois et son lendemain, bof bof aussi.)

    Mais bon a priori, pour ça, je prendrais juste le mois et l'année de chaque Date (avec un Calendar,) je multiplierais les années par 12, ajouterais les mois, et considérerais la différence comme le nombre de mois entre les deux dates.

    'Fin bon, ces messages datent de 2007, je ne pense pas que les auteurs originaux puissent venir défendre leurs idées.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    429
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 429
    Points : 475
    Points
    475
    Par défaut
    Bonjour,

    @danyboy85

    Mouai, ça marchotte... [...] Tout ceci n'est pas logique. Si entre le premier jour et le dernier jour du mois la fonction retourne 0 mois, alors elle devrait retourner 1 mois entre le premier jour du mois et le dernier jour du mois suivant.
    E clair je devrais avoir comme résultat 0 puis 1 ou 1 puis 2, mais pas 0 et 2.
    Même si mon code n'est peut-être pas le meilleur, il me semble qu'il fonctionne.

    Le problème vient de vos données d'entrée. En effet, le 31 avril n'existe pas, et Java le convertit probablement en 1er mai, d'où les 2 mois.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                System.out.println(nbOfMonthsBetweenTwoDates("1/3/2007", "31/3/2007")+" mois"); // --> 0 mois
                System.out.println(nbOfMonthsBetweenTwoDates("1/3/2007", "30/4/2007")+" mois"); // --> 1 mois
                System.out.println(nbOfMonthsBetweenTwoDates("1/3/2007", "31/4/2007")+" mois"); // --> 2 mois (1er mai)
                System.out.println(nbOfMonthsBetweenTwoDates("3/1/2007", "2/4/2007")+" mois"); // --> 2 mois
    Cordialement,

    Nicolas

  9. #9
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 560
    Points : 21 622
    Points
    21 622
    Par défaut
    Ça marche, et l'objection de danyboy85 ne tient effectivement pas.

    Mais ça boucle. C'est un peu dommage, si un utilisateur s'amuse à demander le nombre de mois entre le 2 Février 45 et le 6 Mars 1347418, que ça fasse une boucle sur plus d'un million d'années.
    Bon, c'est vrai que ça se calcule vite, mais tout de même.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    429
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 429
    Points : 475
    Points
    475
    Par défaut
    Pour ma part, je pense que la solution proposée plus haut par thelvin est la plus efficace.

    Petit bémol sur celle de Bezout : basée sur un mois "standard" de 30 jours, elle ne permet pas d'identifier les mois pleins.
    Par exemple :
    du 1er février 2010 au 1er mars 2010 : 0,9333... mois mais en fait 1 mois plein
    du 1er avril 2010 au 1er mai 2010 : 9,9666... mois mais en fait 0 mois plein
    Comment faire la différence ?

    Cordialement,

    Nicolas

  11. #11
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 560
    Points : 21 622
    Points
    21 622
    Par défaut
    Citation Envoyé par Nicolas_75 Voir le message
    Comment faire la différence ?
    En ne faisant pas 1 mois = 30 jours.
    Un mois ne fait pas 30 jours. Un mois est le temps qui passe entre le 1er de chaque mois, ou le 2 de chaque mois, etc.

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

Discussions similaires

  1. Calcul du nombres de mois entre deux dates : erreur
    Par khroutchev dans le forum Access
    Réponses: 1
    Dernier message: 23/05/2013, 14h11
  2. [XL-2007] Calculer le nombre de mois entre deux dates?
    Par EmmanuelleC dans le forum Excel
    Réponses: 11
    Dernier message: 08/06/2010, 04h11
  3. [SQL] Calcul du nombre de mois entre deux dates
    Par Lolie11 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 09/03/2009, 11h46
  4. Calcul du nombre de mois entre 2 dates
    Par marrabelle dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 26/04/2007, 01h31
  5. Calcul du nombre de mois entre 2 dates
    Par Bes74 dans le forum Access
    Réponses: 1
    Dernier message: 22/08/2006, 22h15

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