Validation d'un date (java)

Fermé
Ivvrick - 8 déc. 2001 à 18:53
 jissoo - 24 mars 2012 à 17:10
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

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
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
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
Merci beaucoup, j'étais passé à coté...
A+
0
switch1 Messages postés 57 Date d'inscription samedi 16 décembre 2000 Statut Membre Dernière intervention 17 avril 2009 1
2 févr. 2009 à 13:30
hhh
thank you
1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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
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
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
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
switch1 Messages postés 57 Date d'inscription samedi 16 décembre 2000 Statut Membre Dernière intervention 17 avril 2009 1
28 janv. 2009 à 20:28
Monsieur Hacktrack
ton objet marche pas bien
essayer
year : 2009
mois :1
jours 30 ou 31
!!!!!!!!!!!!!!!!!!!!
0
cool g Messages postés 37 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 25 août 2010 25
5 avril 2009 à 01:49
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
Utilisateur anonyme
5 avril 2009 à 08:12
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
Utilisateur anonyme
22 mars 2011 à 18:20
Salut,

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