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

Java Discussion :

Comparer deux dates en ignorant l'heure


Sujet :

Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 26
    Par défaut Comparer deux dates en ignorant l'heure
    Bonjour à tous,

    je cherche une méthode simple pour comparer deux dates en ignorant l'heure.
    J'ai une méthode existante qui utilise des méthodes dépréciées, que je voudrais réécrire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    private boolean dateBeforeOrEqual(Date date, Date dateRef) {
    		GregorianCalendar dateCourante = new GregorianCalendar(date.getYear()+1900, date.getMonth(), date.getDate());
    		GregorianCalendar dateReference = new GregorianCalendar(dateRef.getYear()+1900, dateRef.getMonth(), dateRef.getDate());
     
    		if (dateCourante.before(dateReference) || dateCourante.equals(dateReference))
    			return true;
    		else
    			return false;
    	}
    La solution que j'ai trouvée pour le moment est celle là:

    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
    private boolean dateBeforeOrEqual2(Date date, Date dateRef) {
    		GregorianCalendar dateCourante = new GregorianCalendar();
    		dateCourante.setTime(date);
    		dateCourante.set(Calendar.HOUR_OF_DAY, 0);
    		dateCourante.set(Calendar.MINUTE, 0);
    		dateCourante.set(Calendar.SECOND, 0);
    		dateCourante.set(Calendar.MILLISECOND, 0);
     
    		GregorianCalendar dateReference = new GregorianCalendar();
    		dateReference.setTime(dateRef);
    		dateReference.set(Calendar.HOUR_OF_DAY, 0);
    		dateReference.set(Calendar.MINUTE, 0);
    		dateReference.set(Calendar.SECOND, 0);
    		dateReference.set(Calendar.MILLISECOND, 0);
     
    		if (dateCourante.before(dateReference) || dateCourante.equals(dateReference))
    			return true;
    		else
    			return false;
    	}
    C'est un peu lourd...
    Est-ce que vous voyez un meilleur moyen de réécrire cette méthode sans utiliser les méthodes dépréciées de la classe Date?

  2. #2
    Membre expérimenté Avatar de aperrin
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    221
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 221
    Par défaut
    yoda time

  3. #3
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par aperrin Voir le message
    yoda time
    Je pense que tu veux parler de Joda Time


    C'est en effet une bonne idée si on a de gros besoin de gestion des heures/dates...

    Mais s'il s'agit d'un besoin épisodique, ajouter une librairie entière peut s'avérer peut pratique... surtout que je trouve la seconde version assez propre, même si j'aurais privilégier Calender.getInstance() et clear() :
    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
    	private boolean dateBeforeOrEqual(Date date, Date dateRef) {
    		Calendar dateCourante = Calendar.getInstance();
    		dateCourante.setTime(date);
    		dateCourante.clear(Calendar.HOUR_OF_DAY);
    		dateCourante.clear(Calendar.MINUTE);
    		dateCourante.clear(Calendar.SECOND);
    		dateCourante.clear(Calendar.MILLISECOND);
     
    		Calendar dateReference = Calendar.getInstance();
    		dateReference.setTime(dateRef);
    		dateReference.clear(Calendar.HOUR_OF_DAY);
    		dateReference.clear(Calendar.MINUTE);
    		dateReference.clear(Calendar.SECOND);
    		dateReference.clear(Calendar.MILLISECOND);
     
    		//return (dateCourante.before(dateReference) || dateCourante.equals(dateReference))
    		return dateCourante.compareTo(dateReference) <= 0;
    	}
    Qu'as-tu à reprocher à cette méthode, si ce n'est sa taille ?

    a++

  4. #4
    Rédacteur
    Avatar de lunatix
    Homme Profil pro
    Architecte technique
    Inscrit en
    Novembre 2002
    Messages
    1 960
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 960
    Par défaut
    oui, la deuxième méthode est pas mal, mais lourde.

    perso, a chaque fois que je dois manipuler des dates, je m'inclus un petit import (une classe) qui me permet d'écrire des choses comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Date date = now().clearTime().toDate();
    ca me simplifie grandement la vie !

    d'ailleurs, j'étais passé a coté de la méthode clear() pour mon clearTime()
    je vais améliorer ça (merci adiGuba)

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 26
    Par défaut
    Merci adiGuba,

    c'est plus propre comme tu l'écris.

    Effectivement c'est la taille de la méthode qui me gêne un peu vu qu'il faut une bonne dizaine de lignes pour comparer deux pauvres dates

    Aucun moyen d'optimiser ça?

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 26
    Par défaut
    Citation Envoyé par lunatix Voir le message
    oui, la deuxième méthode est pas mal, mais lourde.

    perso, a chaque fois que je dois manipuler des dates, je m'inclus un petit import (une classe) qui me permet d'écrire des choses comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Date date = now().clearTime().toDate();
    ca me simplifie grandement la vie !

    d'ailleurs, j'étais passé a coté de la méthode clear() pour mon clearTime()
    je vais améliorer ça (merci adiGuba)
    Donc tu as ta propre classe Date avec un clearTime() c'est ça?

  7. #7
    Rédacteur
    Avatar de lunatix
    Homme Profil pro
    Architecte technique
    Inscrit en
    Novembre 2002
    Messages
    1 960
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 960
    Par défaut
    non, justement, ce qui me gene dans joda, c'est le remplacement de Date.
    j'ai un gros builder qui wrappe Date et Calendar. Un genre de classe Util.

    http://code.google.com/p/datedsl/ si tu veux voir. mais cette version est incomplète et pas finie. mais ca donne une bonne idée

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 26
    Par défaut
    ok merci pour le lien

    ça fait quoi l'import static exactement?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    import static com.unimondes.dsl.DateDsl.*;

  9. #9
    Membre éprouvé
    Avatar de Deadpool
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    1 312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 1 312
    Par défaut
    Citation Envoyé par Romz_Java Voir le message
    ok merci pour le lien

    ça fait quoi l'import static exactement?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    import static com.unimondes.dsl.DateDsl.*;
    http://java.developpez.com/faq/java/..._import_static

    Dispo seulement à partir de Java 5.

  10. #10
    Rédacteur
    Avatar de lunatix
    Homme Profil pro
    Architecte technique
    Inscrit en
    Novembre 2002
    Messages
    1 960
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 960
    Par défaut
    ouép.

    en clair ca permet d'ecrire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Date date = date().withYear(2008)
                            .withMonth(Calendar.JANUARY)
                            .withDayOfMonth(15)
                            .toDate();
    plutôt que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Date date = DateDsl.date().withYear(2008)
                            .withMonth(Calendar.JANUARY)
                            .withDayOfMonth(15)
                            .toDate();

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 26
    Par défaut
    ok, si je comprends bien ça importe les méthodes static, comme son nom l'indique quoi

    (Moi je suis en java 4 de toute façon)

    Sinon personne ne voit comment optimiser ma pauvre méthode en restant dans l'api standard?

    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
    	private boolean dateBeforeOrEqual(Date date, Date dateRef) {
    		Calendar dateCourante = Calendar.getInstance();
    		dateCourante.setTime(date);
    		dateCourante.clear(Calendar.HOUR_OF_DAY);
    		dateCourante.clear(Calendar.MINUTE);
    		dateCourante.clear(Calendar.SECOND);
    		dateCourante.clear(Calendar.MILLISECOND);
     
    		Calendar dateReference = Calendar.getInstance();
    		dateReference.setTime(dateRef);
    		dateReference.clear(Calendar.HOUR_OF_DAY);
    		dateReference.clear(Calendar.MINUTE);
    		dateReference.clear(Calendar.SECOND);
    		dateReference.clear(Calendar.MILLISECOND);
     
    		//return (dateCourante.before(dateReference) || dateCourante.equals(dateReference))
    		return dateCourante.compareTo(dateReference) <= 0;
    	}

  12. #12
    Rédacteur
    Avatar de lunatix
    Homme Profil pro
    Architecte technique
    Inscrit en
    Novembre 2002
    Messages
    1 960
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 960
    Par défaut
    ah bah non. ta méthode est tres bien.
    Tout ce que tu peux faire, c'est te faire une classe utilitaire avec pour pouvoir la réutiliser partout.

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 26
    Par défaut
    Ok je m'en tiens là alors

    Merci à tous!

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : Cameroun

    Informations forums :
    Inscription : Avril 2009
    Messages : 168
    Par défaut
    Bonjour,

    ma réponse arrive très tard mais bon, à toute fin utile:
    pour faire cette comparaison, j'utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DateUtils.isSameDay(currentDay, changeDay)
    currentDay et changeDay sont de type java.util.Date. Cette méthode provient de la librairie org.apache.commons.lang

  15. #15
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Hello,

    Citation Envoyé par lekonquerant Voir le message
    Cette méthode provient de la librairie org.apache.commons.lang
    Si on l'a déjà intégrée à son projet, pourquoi pas. Mais sinon, quitte à intégrer une bibliothèque visant à se simplifier la vie, joda-time me semble une meilleure idée.
    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. Réponses: 1
    Dernier message: 09/03/2014, 21h46
  2. Comment comparer deux dates
    Par vodevil dans le forum Modules
    Réponses: 6
    Dernier message: 01/09/2005, 18h24
  3. comparer deux dates
    Par adel25 dans le forum C++
    Réponses: 3
    Dernier message: 23/08/2005, 20h29
  4. Comparer deux dates
    Par LoicH dans le forum C++Builder
    Réponses: 4
    Dernier message: 04/03/2005, 22h53
  5. comment comparer deux dates?
    Par billoum dans le forum C++Builder
    Réponses: 2
    Dernier message: 21/08/2004, 21h08

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