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 :

Contrôler que deux dates sont consécutives


Sujet :

Collection et Stream Java

  1. #1
    Membre du Club
    Profil pro
    lead dev
    Inscrit en
    Février 2008
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : lead dev

    Informations forums :
    Inscription : Février 2008
    Messages : 75
    Points : 65
    Points
    65
    Par défaut Contrôler que deux dates sont consécutives
    Bonjour,

    Mon problème est simple, je dois vérifier que deux dates sont consécutives :

    Algo :

    if(date1.equals(date2-1jour)){
    return true;
    }
    else {
    return false;
    }

    Si bien que si entre date1 et date2 on a deux jours d'écart le méthode retourne false.

    Savez vous comment on peut implémenter ca en java ?

    Bien à vous

  2. #2
    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
    si date1.getTime()>date2.getTime(), alors date1 est ultérieur à date2

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    765
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 765
    Points : 1 036
    Points
    1 036
    Par défaut
    Bonjour,

    Tu peux te baser sur l'API JodaTime, il y a tout ce qu'il faut pour manipuler des dates :
    http://joda-time.sourceforge.net/quickstart.html


    Bon courage,

  4. #4
    Membre du Club
    Profil pro
    lead dev
    Inscrit en
    Février 2008
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : lead dev

    Informations forums :
    Inscription : Février 2008
    Messages : 75
    Points : 65
    Points
    65
    Par défaut
    Nop tchize en plus de vérifier que date2.after(date1) == true, je dois vérifier que date1 et date2 sont deux journées qui se suivent :
    - maMethode(1erDecembre, 2Decembre) retourne true.
    - maMethode(1erDecembre, 3Decembre) retourne false.

    Jimmy merci du tuyau, je vais fouiller cette API.

    Je vous tiens au courant du résultat, on sait jamais ca pourrait servir ^^ !


    En tout cas merci à vous deux pour votre aide !

  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
    S'il est vrai que JodaTime simplifie les choses, JodaTime ne propose pas à ma connaissance de méthode Date.isConsecutiveTo(Date)

    Autrement dit, même combat que sans JodaTime, la question c'est comment. Je propose de transformer les deux dates en DateMidnight (ça enlève la composante heure du jour et ne garde que la date), et voir si la première avec plusDays(1) est equals() à la seconde.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre du Club
    Profil pro
    lead dev
    Inscrit en
    Février 2008
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : lead dev

    Informations forums :
    Inscription : Février 2008
    Messages : 75
    Points : 65
    Points
    65
    Par défaut
    Du coup j'ai fait ca à la main en utilisant Calendar.
    D'après les JUnit ca a l'air de marcher.

    Merci pour vos coups de pouce !

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
       /**
         * Méthode qui controle si deux dates sont consécutives
         * 
         * @param dateJour
         * @param dateLendemain
         * @return true si les dates se suivent, false si elles n'ont pas un jour
         *         d'écart
         */
        private boolean siDateConsecutive(Date dateReference, Date dateLendemain)
        {
            if (dateReference != null && dateLendemain != null)
            {
                // Récupération du calendrier
                Calendar calendrier = Calendar.getInstance();
                if (calendrier != null)
                {
                    // Données sur la date de référence
                    calendrier.setTime(dateReference);
                    // Numéro du jour dans l'année
                    int jourRef = calendrier.get(Calendar.DAY_OF_YEAR);
                    // Numéro de l'année
                    int anneeJourRef = calendrier.get(Calendar.YEAR);
                    // Numéro du mois dans l'année
                    int moisJourRef = calendrier.get(Calendar.MONTH);
                    // Numéro du jour dans le mois
                    int jourDansMoisRef = calendrier.get(Calendar.DAY_OF_MONTH);
     
                    // Données sur la date dite de lendemain
                    calendrier.setTime(dateLendemain);
                    // Numéro du jour dans l'année
                    int lendemain = calendrier.get(Calendar.DAY_OF_YEAR);
                    // Numéro de l'année
                    int anneeLendemain = calendrier.get(Calendar.YEAR);
                    // Numéro du mois dans l'année
                    int moisLendemain = calendrier.get(Calendar.MONTH);
                    // Numéro du jour dans le mois
                    int lendemainDansMois = calendrier.get(Calendar.DAY_OF_MONTH);
     
                    // Pour deux dates de la même année : 1 jour sépare les deux
                    // dates
                    if (anneeJourRef == anneeLendemain && (lendemain - jourRef) == 1)
                    {
                        return true;
                    }
                    // Pour deux date d'année différente : la date de référence est
                    // le
                    // 31/12, la date dite de lendemain est le 01/01 de l'année
                    // d'après
                    else if ((anneeLendemain - anneeJourRef) == 1 && moisJourRef == Calendar.DECEMBER && jourDansMoisRef == 31
                        && moisLendemain == Calendar.JANUARY && lendemainDansMois == 1)
                    {
                        return true;
                    }
                }
            }
            // Dans tous les autres cas, on retourne false
            return false;
        }

  7. #7
    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
    Normalement ça marche, oui.

    Personnellement j'aurais aligné les deux dates à minuit, ajouté un jour à la premier et vérifié si ça m'amène à la seconde. Comme ça c'est Calendar qui se tape la gestion du 31 Décembre.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2008
    Messages
    328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Mexique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 328
    Points : 459
    Points
    459
    Par défaut
    Salut,

    Et pourquoi pas ceci:

    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
    33
    34
    35
    36
    37
     
    // date A
             int aaA = 2010;
             int mmA = 12;
             int jjA = 6;
     
          // date B
             int aaB = 2010;
             int mmB = 12;
             int jjB = 7;
     
          // parametrage de GregorianCalendar pour la date A
             int anneeA = aaA;
             int num_moisA = mmA;
             int jourA = jjA;
             Calendar dA = new GregorianCalendar(anneeA, num_moisA - 1, jourA);
          // NE PAS OUBLIER num_moisA - 1 !!!...
     
          // parametrage de GregorianCalendar pour la date B
             int anneeB = aaB;
             int num_moisB = mmB;
             int jourB = jjB;
             Calendar dB = new GregorianCalendar(anneeB, num_moisB - 1, jourB);
     
          // calcul de la différence entre les 2 dates (en millisecondes)
             long millisA = dA.getTimeInMillis();
             long nbjoursA = millisA / (24*60*60*1000);
     
             long millisB = dB.getTimeInMillis();
             long nbjoursB = millisB / (24*60*60*1000);
          // la différence en jours
             long diffenjours = nbjoursA - nbjoursB;
     
             long jours = diffenjours;
     
             if ( (jours == 1) || (jours == -1) )
                System.out.println("Diff. en jours = " + jours + ": les 2 dates sont consécutives...");

    Cordialement,

    Dan

  9. #9
    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 danimo Voir le message
    Et pourquoi pas ceci:
    Je dirais, personnellement :
    - Parce que ça ne tient pas compte des changements d'heure (un jour calendaire ne fait pas forcément 24 heures, et on peut même débattre qu'une minute fasse 60 secondes ou pas.)
    - Parce que ce n'est pas franchement plus simple.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    765
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 765
    Points : 1 036
    Points
    1 036
    Par défaut
    Je ne defend pas particulièrement JodaTime, mais ajouter 1 jour se fait en 1 ligne :

    DateTime dt = new DateTime(2005, 3, 26, 12, 0, 0, 0);
    DateTime plusPeriod = dt.plus(Period.days(1));

    Ensuite tu as les méthodes equals, compareTo ou isEqual ...

  11. #11
    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
    JodaTime ou Calendar: même combat. Ces classe ont des méthodes qui ajoutnent "proprement" un jour à une date existante en tenant compte de toutes les règles (secondes intercalaires, leap time, changements historiques de leap time, etc). Autant les utiliser plutot que de jouer la bidouille.

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

Discussions similaires

  1. UPDATE DATE1 = DATE2 > les deux dates sont différentes ?!
    Par vmolines dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 16/06/2008, 16h50
  2. Réponses: 7
    Dernier message: 11/04/2008, 14h37
  3. detecter que deux Hostnames sont pour 1 machine?
    Par bliml dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 05/05/2007, 08h17
  4. Comment savoir que deux dates sont égales ?
    Par bassim dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 19/12/2006, 19h36
  5. Tester si deux dates sont dans la même semaine ?
    Par boulzor dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 13/02/2006, 19h15

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