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

Langage Java Discussion :

comparer format de deux dates


Sujet :

Langage Java

  1. #1
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 99
    Points : 44
    Points
    44
    Par défaut comparer format de deux dates
    Bonjour,

    J'aimerai savoir comment comparer le format de deux dates.
    Dans mon appli, je rentre une date de début et une date de fin. J'aimerai donc être sûr que :
    1) mes dates sont valides
    2) mes dates sont au même format
    3) la date de début est inférieure à la date de fin

    Par exemple :
    date1 = 2002-09-25 (format yyyy-MM-dd)
    date2 = 2004/11/12 (format yyyy/MM/dd)

    J'aimerai dans le cas où elles ne sont pas au même format je lève une exception.

  2. #2
    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
    Marrant. Moi je préfère fixer un seul format de date, et l'utilisateur doit s'y tenir, un point c'est tout. (Ou à la rigueur il peut définir un autre format dans ses préférences.)

    Pour faire ça, je ferais :

    - D'abord je construis un tableau DateFormat[] qui contient les formats de date que je veux bien accepter. Je les mets tous setLenient(false) pour qu'ils refusent les dates invalides.

    - Quand je veux valider deux dates :
    - Pour chaque DateFormat,
    -- Je parse date1 avec.
    -- Je parse date2 avec.
    -- Si une exception est arrivée à l'un ou l'autre, alors soit la date est invalide, soit elle n'est pas au format en question. Passer au format suivant dans la liste.
    -- S'il n'y a pas d'exception, les deux dates sont valides, et sont dans le format en question, donc dans le même format.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 99
    Points : 44
    Points
    44
    Par défaut
    Effectivement, l'idéal est d'avoir un seul format. Mais les specs de mon appli spécifient deux formats : yyyy/MM/dd et yyyy/MM/dd HH:mm:ss.

    Je vais tester ton algo.

  4. #4
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 99
    Points : 44
    Points
    44
    Par défaut
    Voilà ce que j'ai fait :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public static boolean isValidDate(String dateString) {
        try {
            SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd");
     
            formatter.setLenient(false);
            formatter.parse(dateString);
            return true;
        } catch (Exception e) {
            return false;
        }
    }
    Mais le problème c’est que quand je mets ‘2009/22/18’ elle renvoie 'true' alors que logiquement les mois s’arrêtent à 12.
    Ils interprètent 22 comme 10 cad octobre.

    Est ce que c'est normal ?

  5. #5
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 380
    Points : 480
    Points
    480
    Par défaut
    Bonjour,

    A vue d'œil si tu utilises
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    formatter.setLenient(false);
    C'est pas normal que ça retourne "true".
    tu es sur que le code que tu donnes est bien celui qui a été exécuté??

    a+

  6. #6
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 99
    Points : 44
    Points
    44
    Par défaut
    Salut,

    effectivement,après vérification :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    String testDate = "2004/22/18";
    boolean result = isValidDate(textDate); //result = false;
    Par contre quand je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    String textDate = "2004/10/25 20:52:10";
    isValidDate(textDate);
    la méthode renvoie :
    Bizarre quand même !
    Est ce normal ?

  7. #7
    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
    oui, en lenient on t'autorise des chose genre 31 jours en février,etc. Sans, il n'y a pas d'heuristique. Mais le parser reste un parseur, pas un validateur. Il va lire la string jusqu'à avoir rencontré tous les élément formant ta date et c'est tout. La crasse à la fin il n'en tiens pas compte. Pour etre sur que le format est strictement respecté, c'est comme 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
    import java.text.SimpleDateFormat;
    import java.util.Date;
     
     
    public class TestDate {
    	public static boolean isValidDate(String dateString) {
    	    try {
    	        SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd");
     
    	        formatter.setLenient(false);
    	        Date d = formatter.parse(dateString);
    	        return formatter.format(d).equals(dateString);
    	    } catch (Exception e) {
    	        return false;
    	    }
    	}
    	/**
             * @param args
             */
    	public static void main(String[] args) {
    		String[] dates = new String[]{"2004/22/18","2004/10/25","2004/10/25 20:52:10"};
    		for (String date:dates)
    			System.out.println(date+" valid?: "+isValidDate(date));
     
    	}
     
    }
    On vérifie donc que ce qu'on a lut correspond bien à ce qui a été écrit.

  8. #8
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 99
    Points : 44
    Points
    44
    Par défaut
    Merci modérateur...C'est super; ça marche.
    Et comment je peux maintenant vérifier si deux dates sont au même format ?

  9. #9
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 99
    Points : 44
    Points
    44
    Par défaut
    Voilà ce que j'ai fait pour vérifier si deux dates sont au même format, est ce que c'est bon ?

    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
    public static boolean isValidDate(String date1, String date2) {
    	    try {
    	        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
     
    	        formatter.setLenient(false);
    	        Date d1 = formatter.parse(date1);
    	        Date d2 = formatter.parse(date2);
     
    	        if (formatter.format(d1).equals(date1) && formatter.format(d2).equals(date2)){
    	        	return true;
    	        }
    	        else{
    	        	return false;
    	        }
     
    	    } catch (Exception e) {
    	        return false;
    	    }
    	}

  10. #10
    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
    c'est une possibilité, ou tu appellele validateDate de tout à l'heure deux fois avec le même format 2 true = deux dates dans ce format.

  11. #11
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 99
    Points : 44
    Points
    44
    Par défaut
    j'avais oublié une petite précision : j'ai des type "Calendar" en entrée et non des String.
    Comment procéder dans ce cas ?

  12. #12
    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
    un Calendar n'a pas de format, ca n'a donc pas de sens de vouloir comparer le format des dates! Les point 1 et 2 de ta question initiales sont donc irrelevants. Reste le point trois, il suffit d'utiliser Calendar.before(Calendar)

Discussions similaires

  1. Comparer deux dates au format : mid(date, 1, 10)
    Par Superkoala42 dans le forum VBScript
    Réponses: 2
    Dernier message: 08/07/2014, 08h48
  2. Comparer deux dates format jj/mm/aaaa
    Par Erwy dans le forum Télécharger
    Réponses: 0
    Dernier message: 10/01/2012, 16h11
  3. Comparer deux dates au format TEXT
    Par ptilemare dans le forum Requêtes
    Réponses: 6
    Dernier message: 16/07/2010, 22h39
  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