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

Android Discussion :

Nombre de jours entre deux dates avec Calendar


Sujet :

Android

  1. #1
    Futur Membre du Club
    Inscrit en
    Août 2009
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 4
    Points : 5
    Points
    5
    Par défaut Nombre de jours entre deux dates avec Calendar
    Bonjour,

    Je souhaite récupérer le nombre de jours qui séparent deux dates. Je ne veux cependant pas tenir compte des heures des deux dates, par exemple si je compare la date 01/01/2017 23:59 et 02/01/2017 00:01 je souhaite que cela me retourne quand même 1 jour car je considère que ce n'est pas le même jour (malgré les deux minutes de différence réelle entre ces deux dates).

    J'ai, peut être bêtement, fait avec la fonction suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    public static long daysBetween(Calendar startDate, Calendar endDate) {
            long millis = endDate.getTimeInMillis() - startDate.getTimeInMillis();
            return (int)Math.round((double)millis / 86400000);
    }
    Je me suis alors vite rendu compte que cela prenait en compte les heures dans la différence. J'ai alors essayé de ne garder que les jours/mois/année et de définir l'heure moi même afin d'éviter ce problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    public static long daysBetween(Calendar startDate, Calendar endDate) {
            startDate.set(Calendar.HOUR, 0);
            endDate.set(Calendar.HOUR, 24);
            startDate.set(Calendar.MINUTE, 0);
            endDate.set(Calendar.MINUTE, 0);
            startDate.set(Calendar.SECOND, 0);
            endDate.set(Calendar.SECOND, 0);
            long millis = endDate.getTimeInMillis() - startDate.getTimeInMillis();
            return (int)Math.round((double)millis / 86400000);
    }
    Ca marche effectivement un peu mieux, mais j'ai toujours quelques comportements étranges. Par exemple si nous sommes le 07/02 à 8h et que je passe ça à ma fonction avec la date 07/02, cela me retourne 1 jour de différence... Par contre quand on passe après 12h le 07/02 cela me retourne 0 jours de différence... Je ne comprend pas trop pourquoi cela prend toujours en compte l'heure du jour là dedans malgré mes tentatives de ne garder que les jour/mois/année...

    Quelqu'un pourrait m'expliquer et éventuellement solutionner mon soucis ?

    Merci d'avance !

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Citation Envoyé par SixtyFourWarrior Voir le message
    Ca marche effectivement un peu mieux, mais j'ai toujours quelques comportements étranges. Par exemple si nous sommes le 07/02 à 8h et que je passe ça à ma fonction avec la date 07/02, cela me retourne 1 jour de différence...
    Calendar.HOUR c'est l'heure sur 12h, c'est HOUR_OF_DAY l'heure sur 24 heures.
    Ta date de début est à 0h (donc 12h la veille) et ta date de fin à 24 (12h le jour même), donc si datedebut=datefin, alors le calcul donne datedebut-datedebut = 24 heures (et encore, s'il n'y a pas passage à l'heure d'hiver ou d'été entre les deux jours) =1 jour ! Et ça le ferait aussi avec HOUR_OF_DAY, d'avoir un décalage de 24 heures.

    C'est pourquoi pour faire ce genre de choses sans bidouiller, on utilise des bibliothèques mieux foutues que java.util.Data/java.util.Calendar, comme Joda-Time(Joda-Time-Android spécifiquement pour toi), ou java.time en Java 8.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Expert confirmé
    Avatar de Hephaistos007
    Profil pro
    Enseignant Chercheur
    Inscrit en
    Décembre 2004
    Messages
    2 493
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 493
    Points : 4 166
    Points
    4 166
    Par défaut
    Tu as essayé ?
    Code java : 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
    public static int daysBetween(Calendar day1, Calendar day2){
        Calendar dayOne = (Calendar) day1.clone(),
                dayTwo = (Calendar) day2.clone();
     
        if (dayOne.get(Calendar.YEAR) == dayTwo.get(Calendar.YEAR)) {
            return Math.abs(dayOne.get(Calendar.DAY_OF_YEAR) - dayTwo.get(Calendar.DAY_OF_YEAR));
        } else {
            if (dayTwo.get(Calendar.YEAR) > dayOne.get(Calendar.YEAR)) {
                //swap them
                Calendar temp = dayOne;
                dayOne = dayTwo;
                dayTwo = temp;
            }
            int extraDays = 0;
     
            int dayOneOriginalYearDays = dayOne.get(Calendar.DAY_OF_YEAR);
     
            while (dayOne.get(Calendar.YEAR) > dayTwo.get(Calendar.YEAR)) {
                dayOne.add(Calendar.YEAR, -1);
                // getActualMaximum() important for leap years
                extraDays += dayOne.getActualMaximum(Calendar.DAY_OF_YEAR);
            }
     
            return extraDays - dayTwo.get(Calendar.DAY_OF_YEAR) + dayOneOriginalYearDays ;
        }
    }
    Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes --- devise SHADOKS

    Kit de survie Android : mon guide pour apprendre à programmer sur Android, mon tutoriel sur les web services et enfin l'outil en ligne pour vous faire gagner du temps - N'oubliez pas de consulter la FAQ Android

  4. #4
    Futur Membre du Club
    Inscrit en
    Août 2009
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Merci à vous deux !

    Calendar.HOUR c'est l'heure sur 12h, c'est HOUR_OF_DAY l'heure sur 24 heures.
    Ca m'apprendra à mieux lire la doc tiens ! Merci pour l'explication !

    Je me suis renseigné sur Joda Time suivant les conseils de joel.drigo et je suis finalement parvenu à ce résultat qui fonctionne parfaitement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public static long daysBetweenDates(Calendar startDate, Calendar endDate) {
     
            DateTime start = new DateTime(startDate.get(Calendar.YEAR), startDate.get(Calendar.MONTH)+1, startDate.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
            DateTime end = new DateTime(endDate.get(Calendar.YEAR), endDate.get(Calendar.MONTH)+1, endDate.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
     
            return daysBetween(start.withTimeAtStartOfDay(), end.withTimeAtStartOfDay()).getDays();
     
    }
    Petit à petit je pense que je vais remplacer l'ensemble des utilisation de Calendar dans mon appli par JodaTime qui semble bien plus pratique. En attendant, la fonction ci-dessus s'intègre parfaitement au reste et fait bien le boulot.

    Merci encore !

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

Discussions similaires

  1. calcul nombre de jours entre deux dates
    Par charlene44 dans le forum Langage
    Réponses: 7
    Dernier message: 21/08/2012, 15h06
  2. Réponses: 2
    Dernier message: 29/05/2006, 20h16
  3. [MS-DOS] Compter les nombres de jours entre deux dates diffé
    Par Furius dans le forum Scripts/Batch
    Réponses: 4
    Dernier message: 19/02/2006, 14h33
  4. nombre de jours entre deux date
    Par mzt.insat dans le forum Langage
    Réponses: 13
    Dernier message: 01/02/2006, 11h34
  5. [Dates] Nombre de jours entre deux dates
    Par cmoiscrat dans le forum Langage
    Réponses: 3
    Dernier message: 22/09/2005, 16h25

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