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

API standards et tierces Java Discussion :

Gestion des dates


Sujet :

API standards et tierces Java

  1. #1
    Membre confirmé Avatar de cobos
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2014
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2014
    Messages : 111
    Par défaut Gestion des dates
    Bonsoir à tous, je fais une application et je veux obliger l'utilisateur à saisir une date au format MM/JJ/AAAA. Voici comment j'ai procédé:
    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
    System.out.print("Veuillez saisir la date du contrat MM-dd-yyyy    : ");
    	  String dateSaisie =  sc.nextLine();
      	boolean condition = false;
    	  while(condition==false){
    		  if(dateSaisie.matches("[0-9]{2}/[0-9]{2}/[0-9]{4}")){
     
      		SimpleDateFormat f = new SimpleDateFormat("MM-dd-yyyy");
      	    try {
    			Date date = f.parse(dateSaisie);
    			condition = true;
    		} catch (ParseException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
     
      	}
      	else {
      	    System.out.println("Erreur format");
      	    sc.nextLine();
      	}
    	  }
    le problèeme est que même si je mets une date au bon format 12/11/2017 je tombe dans le cas où le format n'est pas valide
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    System.out.println("Erreur format");
      	    sc.nextLine();
    quelqu'un a une idée?

  2. #2
    Modérateur

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

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

    Ma foi, j'ai bien une idée oui .

    Par exemple si tu veux des / dans tes dates, tu ne devrais pas dire à SimpleDateFormat que tu veux des -
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  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,


    Perso je ne trouve pas super la double vérification avec Pattern puis SimpleDateFormat.
    En plus c'est faux car ils n'utilisent pas le même format, donc on ne pourra jamais saisir de date...
    En plus il y a une double gestion des erreurs (qui est également erroné car dans un des cas on ne passe pas à la ligne suivante).

    Il serait préférable de se baser uniquement sur SimpleDateFormat, c'est plus simple et plus lisible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
            SimpleDateFormat formatter = new SimpleDateFormat("MM/dd/yyyy");
            formatter.setLenient(false);
     
            Date date = null;
            while (date==null) {
                System.out.print("Veuillez saisir la date du contrat MM/dd/yyyy    : ");
                try {
                    date = formatter.parse(sc.nextLine(), pos);
                } catch (ParseException e) {
                    System.err.println("Erreur format : " + e.getLocalizedMessage());
                }
            }
    Attention à bien utiliser setLenient(false) pour éviter que SimpleDateFormat "corrige" les dates erronés...


    A noter qu'à partir de Java 8 on pourrait privilégier LocalDate/DateTimeFormatter...


    a++

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 577
    Par défaut
    C'est vrai que la double vérification n'est pas terrible, mais SimpleDateFormat ne t'obligera pas à mettre deux chiffres pour les jours et les mois ni quatre chiffres pour les années.

    Sans valider avec regex ça accepte sans problème des dates comme 4/28/53 pour le "28 Avril" de l'an de grâce 53 après JC.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    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
    Et cette regexp t'empêchera de saisie "1/1/2017" pour le 1er janvier de cette année.
    Mais par contre tu pourras tout à fait saisie "01/01/1017"... à moins d'utiliser une regexp bien plus complexe

    S'il doit y avoir des critères sur la période, il serait plus simple et précis de vérifier la date après le parse :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
                    date = formatter.parse(sc.nextLine());
                    if (date.before(MIN_DATE) || date.after(MAX_DATE)) {
                        System.err.println("Erreur période invalide : " + date);
                        date = null;
                    }

    a++

  6. #6
    Membre confirmé Avatar de cobos
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2014
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2014
    Messages : 111
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Hello,

    Ma foi, j'ai bien une idée oui .

    Par exemple si tu veux des / dans tes dates, tu ne devrais pas dire à SimpleDateFormat que tu veux des -
    vous avez raison, erreur de débutant. Tout fonctionne seulement que la vérification n'est pas parfaite parce qu’utilisateur peut saisir par exemple 44/55/2017 qui n'est pas une date valide, comment on peut gérer ce cas?

  7. #7
    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
    Il faut utiliser setLenient(false) comme indiqué dans mon message.

  8. #8
    Membre confirmé Avatar de cobos
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2014
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2014
    Messages : 111
    Par défaut
    Merci, le teste est parfait seulement que je récupère la date sur le format : Tue Dec 12 00:00:00 UTC 2017, est ce possible de récupérer sous le format 05/22/2017 ?

  9. #9
    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
    Une date n'a pas de format.

    Pour l'afficher comme bon te semble il faut utiliser un SimpleDateFormat adéquat.

  10. #10
    Membre confirmé Avatar de cobos
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2014
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2014
    Messages : 111
    Par défaut
    ok je fais un tour dans la javadoc. Merci cordialement

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

Discussions similaires

  1. gestion des dates dans un formulaire
    Par clement42 dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 18/05/2006, 11h34
  2. [VB6]gestion des dates
    Par luckelm dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 19/04/2006, 20h25
  3. Application international (Gestion des dates)
    Par vsavoir dans le forum C++Builder
    Réponses: 2
    Dernier message: 01/08/2005, 10h22
  4. Réponses: 3
    Dernier message: 13/08/2004, 18h52
  5. [MCD] [MCD] Gestion des dates
    Par brionne dans le forum Schéma
    Réponses: 3
    Dernier message: 30/05/2003, 13h01

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