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 averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 19
    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 chevronné
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    429
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 429
    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 averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

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

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

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

  5. #5
    Membre éclairé 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 : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2005
    Messages : 548
    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 chevronné Avatar de Bezout
    Profil pro
    Développement
    Inscrit en
    Septembre 2003
    Messages
    234
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Développement

    Informations forums :
    Inscription : Septembre 2003
    Messages : 234
    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 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 576
    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.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 429
    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 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 576
    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.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 429
    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 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 576
    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.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

+ 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