Validation d'un date (java)

Ivvrick -  
 jissoo -
Bonjour la liste,

J'ai trois données , le jour JJ , le mois MM , l'année AAAA, et je veux tester la logique de cette date.
Or je me suis servis des méthodes java de DateFormat , gregorianCalendar, mais elles ne permettent que de tester le format de la date , et si je le respecte , je peux leur donner 99/02/2001 sans lever d'erreurs.

Quelqu'un pourrait-il me donner la procédure à suivre en java , ou simplement me donner un algo ( en C ou C++...m'importe ) qui teste la validité d'une date julienne (en prennant en compte toutes les exceptions ...style années bisextile..etc etc..)

Merce de votre aide

10 réponses

  1. Hacktrack
     
    Voici une solution à ton problème:

    import java.util.*;

    /**
    * @author HackTrack
    * @version 1.0
    */
    public class CalTester{

    public CalTester() {
    }

    private boolean testDate(int year, int month, int day){
    GregorianCalendar calendar = new GregorianCalendar();
    calendar.set(year, month, day);
    int goodYear = calendar.get(Calendar.YEAR);
    int goodMonth = calendar.get(Calendar.MONTH);
    int goodDay = calendar.get(Calendar.DAY_OF_MONTH);
    System.out.println("***************************");
    System.out.println("Date entrée = " + year + month + day);
    System.out.println("Date formatée = " + goodYear + goodMonth + goodDay);

    if(goodYear==year & goodMonth==month & goodDay==day){
    System.out.println("Date valide");
    return true;
    }
    System.out.println("Date non valide");
    return false;

    }

    public static void main (String args[]) {
    CalTester tester = new CalTester();

    int yearToTest = 2001;
    int monthToTest = 10 ;
    int dayToTest = 18 ;
    tester.testDate(yearToTest, monthToTest, dayToTest);

    yearToTest = 2001;
    monthToTest = 14 ;
    dayToTest = 18 ;
    tester.testDate(yearToTest, monthToTest, dayToTest);

    yearToTest = -2001;
    monthToTest = 7 ;
    dayToTest = 21 ;
    tester.testDate(yearToTest, monthToTest, dayToTest);

    yearToTest = 2001;
    monthToTest = 158 ;
    dayToTest = 21 ;
    tester.testDate(yearToTest, monthToTest, dayToTest);

    }
    }

    ;-)
    4
  2. danimo
     
    Bonjour,

    Puisque cette demande vient de recevoir une rnouvelle réponse après plus de 7 ans, j'ajoute ceci:

    import java.util.GregorianCalendar;
    ................
    ................

    GregorianCalendar dGC = new GregorianCalendar();

    int annee = 2009;
    int num_mois = 1; // janvier
    int jour = 30; // ne provoque pas la levée de l'exception ou 31, 29 non

    try
    {
    dGC = new GregorianCalendar(annee, num_mois - 1, jour); // 0 = janvier
    // NE PAS OUBLIER num_mois - 1 pour le parametre mois!!!...
    // les num. de mois étant donnés ou obtenus sous la forme 0 à 11

    // controle de la validite de la date: avec setLenient(false) pas d'indulgence:
    dGC.setLenient(false); // sans cette ligne, pas d'exception possible
    // (true par defaut) donc "indulgence"
    // mais très utile pour les manip. de dates (calculs)

    // c'est a la lecture qu'il y a l'eventuelle exception
    int anneeB = dGC.get(GregorianCalendar.YEAR);
    int num_moisB = dGC.get(GregorianCalendar.MONTH);
    int jourB = dGC.get(GregorianCalendar.DAY_OF_MONTH);
    }
    catch (Exception e)
    {
    e.printStackTrace();
    }

    // Avec num_mois = 2; erreur
    // Avec jour > nombre de jours maxi de num_mois ou <0 : erreur
    3
  3. Hacktrack
     
    Voici une solution à ton problème:

    import java.util.*;

    /**
    * @author HackTrack
    * @version 1.0
    */
    public class CalTester{

    public CalTester() {
    }

    private boolean testDate(int year, int month, int day){
    GregorianCalendar calendar = new GregorianCalendar();
    calendar.set(year, month, day);
    int goodYear = calendar.get(Calendar.YEAR);
    int goodMonth = calendar.get(Calendar.MONTH);
    int goodDay = calendar.get(Calendar.DAY_OF_MONTH);
    System.out.println("***************************");
    System.out.println("Date entrée = " + year + month + day);
    System.out.println("Date formatée = " + goodYear + goodMonth + goodDay);

    if(goodYear==year & goodMonth==month & goodDay==day){
    System.out.println("Date valide");
    return true;
    }
    System.out.println("Date non valide");
    return false;

    }

    public static void main (String args[]) {
    CalTester tester = new CalTester();

    int yearToTest = 2001;
    int monthToTest = 10 ;
    int dayToTest = 18 ;
    tester.testDate(yearToTest, monthToTest, dayToTest);

    yearToTest = 2001;
    monthToTest = 14 ;
    dayToTest = 18 ;
    tester.testDate(yearToTest, monthToTest, dayToTest);

    yearToTest = -2001;
    monthToTest = 7 ;
    dayToTest = 21 ;
    tester.testDate(yearToTest, monthToTest, dayToTest);

    yearToTest = 2001;
    monthToTest = 158 ;
    dayToTest = 21 ;
    tester.testDate(yearToTest, monthToTest, dayToTest);

    }
    }

    ;-)
    2
    1. ivvrick
       
      Merci beaucoup, j'étais passé à coté...
      A+
      0
  4. switch1 Messages postés 59 Statut Membre 1
     
    hhh
    thank you
    1
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Fred
     
    Bjr,
    Mysql utilise le format de date AAAA/MM/DD, il va donc te falloir une technique pour inverser la date à partir de ton formulaire.
    1
  7. may
     
    package Date;
    import java.util.Scanner;
    public class Date {
    int j,m,a,val;
    char s='/';
    public void Initialise(int x1,int x2,int x3){
    j=x1;
    m=x2;
    a=x3;
    }
    public int Bissextile(int a){
    if ((a%4)==0)
    return 1;
    return 0;
    }
    public int nbrJours(int m){
    switch (m) {
    case 1:
    case 3:
    case 5:
    case 7:
    case 8:
    case 10:
    case 12: return 31;
    case 4:
    case 6:
    case 9:
    case 11: return 30;
    }
    if (m==2)
    {
    if (Bissextile(a)==1)
    return 29;
    }
    else return 28;
    return 0;
    }
    public int dateValide(){
    if (j<=nbrJours(m))
    return 1;
    return 0;
    }
    public void affiche(){
    if (dateValide()==1)
    System.out.println("la date est "+j+s+m+s+a);
    else System.out.println("La date n'est pas valide");
    }
    public static void main (String argv[])
    {
    Scanner read = new Scanner(System.in);
    int x1,x2,x3;
    System.out.println("Donner le jour");
    x1=read.nextInt();
    System.out.println("Donner le mois");
    x2=read.nextInt();
    System.out.println("Donner l'année");
    x3=read.nextInt();
    Date d1 = new Date();
    d1.Initialise(x1,x2,x3);
    d1.affiche();
    }
    }
    1
    1. vortexs
       
      petite correction : une accolade mal placée

      if (m==2)
      {
      if (Bissextile(a)==1)
      return 29;
      //avant
      else return 28;
      } //une fois corrigé
      return 0;
      }
      0
    2. jissoo
       
      private boolean isdatevalide(/*ton string de la forme jj/mm/aaaaou jj-mm-aaaa*/){
      // isdate a refaire la methode traditionnelle ou khlasse
      boolean vrai=true;

      char [] ll =dd.toCharArray();
      char[] jj= {'0','0'};//new char[2] ;
      char[] mm = {'0','0'};//new char[2];
      char[] aa = {'0','0','0','0'};//new char[4];

      int cpt1=0;
      int cpt2=0;
      for (int i=0;i<ll.length;i++)
      {
      if(ll[i]=='-'){
      cpt1++;}
      if(ll[i]=='/'){
      cpt1++;}
      }
      if(ll.length<8){
      vrai=false;
      }
      if((cpt1==2 && cpt2==0)||(cpt2==2 && cpt1==0))
      {
      //ll.length==10 debut
      if (ll.length==10)
      {
      if ((ll[2]== '-'&& ll[5]=='-')||(ll[2]== '/'&& ll[5]=='/'))
      {
      if(Character.isDigit(ll[0]) && Character.isDigit(ll[1])){
      jj[0]=ll[0];
      jj[1]=ll[1];
      }else{vrai=false;}
      if(Character.isDigit(ll[3]) && Character.isDigit(ll[4])){
      mm[0]=ll[3];
      mm[1]=ll[4];
      }else{vrai=false;}
      if(Character.isDigit(ll[6]) && Character.isDigit(ll[7]) && Character.isDigit(ll[8]) && Character.isDigit(ll[9])){
      aa[0]=ll[6];
      aa[1]=ll[7];
      aa[2]=ll[8];
      aa[3]=ll[9];
      }else{vrai=false;}

      }else{vrai=false;}
      }
      //ll.length==10 fin

      //ll.length==8 debut

      if (ll.length==8)
      {
      if ((ll[1]== '-' && ll[3]=='-')||(ll[1]== '/'&& ll[3]=='/'))
      {
      if(Character.isDigit(ll[0]) ){
      jj[0]='0';
      jj[1]=ll[0];
      }else{vrai=false;}
      if(Character.isDigit(ll[2])){
      mm[0]='0';
      mm[1]=ll[2];
      }else{vrai=false;}
      if(Character.isDigit(ll[4]) && Character.isDigit(ll[5]) && Character.isDigit(ll[6]) && Character.isDigit(ll[7])){
      aa[0]=ll[4];
      aa[1]=ll[5];
      aa[2]=ll[6];
      aa[3]=ll[7];
      }else{vrai=false;}

      }else{vrai=false;}

      }
      //ll.length==8 fin

      //ll.length==9 debut
      if (ll.length==9)
      {
      if ((ll[1]== '-' && ll[4]=='-')||(ll[1]== '/'&& ll[4]=='/'))
      {
      if(Character.isDigit(ll[0]) ){
      jj[0]='0';
      jj[1]=ll[0];
      }else{vrai=false;}
      if(Character.isDigit(ll[2]) && Character.isDigit(ll[3])){
      mm[0]=ll[2];
      mm[1]=ll[3];
      }else{vrai=false;}
      if(Character.isDigit(ll[5]) && Character.isDigit(ll[6]) && Character.isDigit(ll[7]) && Character.isDigit(ll[8])){
      aa[0]=ll[5];
      aa[1]=ll[6];
      aa[2]=ll[7];
      aa[3]=ll[8];
      }else{vrai=false;}

      }else if ((ll[2]== '-' && ll[4]=='-')||(ll[2]== '/'&& ll[4]=='/')){
      if(Character.isDigit(ll[0])&&Character.isDigit(ll[1]) ){
      jj[0]=ll[0];
      jj[1]=ll[1];
      }else{vrai=false;}
      if(Character.isDigit(ll[3])){
      mm[0]='0';
      mm[1]=ll[3];
      }else{vrai=false;}
      if(Character.isDigit(ll[5]) && Character.isDigit(ll[6]) && Character.isDigit(ll[7]) && Character.isDigit(ll[8])){
      aa[0]=ll[5];
      aa[1]=ll[6];
      aa[2]=ll[7];
      aa[3]=ll[8];
      }else{vrai=false;}
      }else{vrai=false;}
      }// ll.length==9 fin
      }else{vrai=false;}

      String jour= new String(jj);
      String mois= new String(mm);
      String annee= new String(aa);
      System.out.println("ladate string"+jour+"/"+mois+"/"+annee);
      int jjjj= Integer.parseInt(jour);
      int mmmm=Integer.parseInt(mois);
      int aaaa=Integer.parseInt(annee);

      GregorianCalendar ex = new GregorianCalendar();
      int an=aaaa;
      if(an<(ex.get(Calendar.YEAR)-11) || an>ex.get(Calendar.YEAR)){
      vrai=false;
      }
      if(mmmm<1 || mmmm>12){
      vrai=false;

      }

      if( mmmm==1 || mmmm==3 || mmmm==5 || mmmm==7 || mmmm==8 || mmmm==10 || mmmm==12)
      {
      if(jjjj<1 || jjjj>31)
      {
      vrai=false;
      }
      }
      System.out.println("ladate int"+jjjj+"/"+mmmm+"/"+aaaa);
      if( mmmm==4 || mmmm==6 || mmmm==9 || mmmm==11)
      {
      if(jjjj<1 || jjjj>30)
      {
      vrai=false;
      }
      }

      if( mmmm==2&& ex.isLeapYear(aaaa))
      {
      if(jjjj<1 || jjjj>29)
      {

      vrai=false;
      }
      }
      if( mmmm==2 && !ex.isLeapYear(aaaa))
      {
      if(jjjj<1 || jjjj>28)
      {

      vrai=false;
      }
      return vrai;
      }
      si vrai= true alors c ok voila
      0
  8. switch1 Messages postés 59 Statut Membre 1
     
    Monsieur Hacktrack
    ton objet marche pas bien
    essayer
    year : 2009
    mois :1
    jours 30 ou 31
    !!!!!!!!!!!!!!!!!!!!
    0
  9. cool g Messages postés 40 Statut Membre 25
     
    Bonjour
    je voudrais récupérer une date d'une JTextField et l'enregistrer dans une base de données Mysql.
    j'arrive à l'ajouter mais la date est tjours 15 10 1580, meme si je met une autre date.
    parexemple pour ce code la date est tjours 15 10 1580;(et si c d2 que j'enregistre dans ma base de donnée)
    comment vais je faire pour insérer une date de naissance 13 02 1987 parexemple
    import java.util.*;
    public class test{
    public static void main(String[]args){
    Date d=new Date();
    Calendar c1=new GregorianCalendar();
    Calendar c=new GregorianCalendar(2009,12,07);
    Date d2=((GregorianCalendar)c).getGregorianChange();

    d2= new java.sql.Date(d.getTime());
    System.out.println(d2.toString()+"\n");

    }
    }
    0
  10. danimo
     
    Salut,

    Tout d'abord, il aurait été préférable d'ouvrir un autre post, car celui-ci concerne un tout autre sujet: contrôler qu'une date est correcte.

    Mais bon...

    tu demandes:

    "je voudrais récupérer une date d'une JTextField et l'enregistrer dans une base de données Mysql.
    j'arrive à l'ajouter mais la date est tjours 15 10 1580, meme si je met une autre date.
    par exemple pour ce code la date est tjours 15 10 1580;(et si c d2 que j'enregistre dans ma base de donnée)
    comment vais je faire pour insérer une date de naissance 13 02 1987 par exemple ..."

    Avec Date d=new Date(); nous obtenons la date (et l'heure) système (qui normalement est la date du jour si on n'a pas "bidouillé" cette date du jour) sous cette forme:
    d = Sat Apr 04 22:53:11 CST 2009 en faisant un println de d

    Avec Calendar c1=new GregorianCalendar(); nous obtiendrons là aussi la date du jour mais sous une toute autre forme.
    par exemple, il nous faudra écrire :

    int annee = c1.get(Calendar.YEAR); pour obtenir l'année (2009),
    int num_mois = c1.get(Calendar.MONTH); pour obtenir le mois (3 car le n° de mois retourné est une valeur de 0 à 11) et
    int jour = c1.get(Calendar.DAY_OF_MONTH); pour obtenir le n° de jour du mois (4 car le n° de jour retourné est 1 à 30)

    Pour entrer une date particulière ( la date de naissance dont il est question dans ton exemple 13 02 1987):
    il faudraet utiliser Calendar c=new GregorianCalendar(int annee, int mois -1, int jour);
    soit:
    Calendar c=new GregorianCalendar(1987, 1, 13);

    Quant à cette ligne :
    Date d2=((GregorianCalendar)c).getGregorianChange();
    Je ne vois pas ce que tu veux faire, mais c'est elle qui te donne ta fameuse date 15 10 1580 (ou quelque chose comme cà).

    Tout celà pour te montrer (ou te rappeler) une toute petite partie de l'utilisation de Calendar.

    Mais tu dis que la date que tu veux enregistrer dans ta base de données est à récupérer dans un JTextField.
    Sous quelle forme est entrée cette date ? Sous quelle forme veux-tu l'envoyer ?
    Tu dois bien avoir un moyen de l'envoyer à ta base sans passer ni par Date, ni par Calendar non !... en faisant un get du JTextField, et en la mettant sous la forme voulue avant de la transférer...

    Si tu as des questions à me poser, n'hésites pas (sauf sur Mysql que je n'ai pas, mais quelqu'un d'autre te répondra sans doute).

    Cordialement,

    Dan
    0
  11. danimo
     
    Salut,

    Dans la BDD il faut que ce soit un String, pas une Date()...
    0