Salut
Je voulais savoir si il existait une méthode vérifiant la validité d'un objet Date ou Calendar.
Par exemple je peux créer sans problème un objet Calendar avec comme valeur 40 pour le jour et 20 pour le mois...
Salut
Je voulais savoir si il existait une méthode vérifiant la validité d'un objet Date ou Calendar.
Par exemple je peux créer sans problème un objet Calendar avec comme valeur 40 pour le jour et 20 pour le mois...
Salut,
Il n'y a a priori pas moyen de savoir si ton calendar/ta date est correct(e) ou pas, tu dois gérer ça par toi même.
Bon courage !
mavina
LOL OK merci je vais m'amuser avec les années bissextiles...
Etonnant quand même ce vide dans java, il doit exister des API, je vais chercher ça...
Tu peux essayer ça avec de l'expression régulière
Testé dans tous les sens
Trouvé sur le forum de Sun (amen)
N'oublie pas d'importer java.util.regex.*;
(Ma date en entrée suit le format immuable JJ/MM/AAAA)
Ca fait même les années bissextiles et tout le toutim, depuis le 01/01/1600 jusque le 31/12/9999.
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 public boolean valideDate(String date_tmp) { String date_finale; String jour; String mois; String annee; jour = date_tmp.substring(0, 1) + date_tmp.substring(1, 2); mois = date_tmp.substring(3, 4) + date_tmp.substring(4, 5); annee = date_tmp.substring(6, 7) + date_tmp.substring(7, 8) + date_tmp.substring(8, 9) + date_tmp.substring(9, 10); date_finale = jour + "/" + mois + "/" + annee; String DatePattern = "^(?:(31)(\\D)(0?[13578]|1[02])\\2|(29|30)(\\D)(0?[13-9]|1[0-2])\\5|(0?[1-9]|1\\d|2[0-8])(\\D)(0?[1-9]|1[0-2])\\8)((?:1[6-9]|[2-9]\\d)?\\d{2})$|^(29)(\\D)(0?2)\\12((?:1[6-9]|[2-9]\\d)?(?:0[48]|[2468][048]|[13579][26])|(?:16|[2468][048]|[3579][26])00)$"; if(date_finale.matches(DatePattern)) return true; else return false; }
T'as de quoi faire
Bien sûr, ça répond indirectement à ton problème en validant la date avant d'instancier un objet Calendar ou Date basé sur ta date.
Bon courage
je reviens sur ce que j'ai dit :
Donc d'apres ce qui est marqué, un monCalendar.setLenient(false) serait suffisant pour déclancher des exceptions en cas d'ajout erroné. (non testé)When a Calendar is lenient, it accepts a wider range of field values than it produces. For example, a lenient GregorianCalendar interprets MONTH == JANUARY, DAY_OF_MONTH == 32 as February 1. A non-lenient GregorianCalendar throws an exception when given out-of-range field settings.
mavina
Ok je vais tester l'histoire du isLenient()...
Sinon j'ai pas trouver d'API mais j'ai écrit ma propre méthode (merci CitizenM mais celle de sun est un peut compliquer pour moi).
A préciser j'utilise des int en entrée comme mes valeurs sont récupérer d'une interface graphique (donc String)
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
28
29 public Boolean VerifDate(int annee,int mois,int jour){ // Déclaration des variables (la création d'un objet GregorianCalendar // permet juste d'accéder à la méthode isLeapYear) Boolean estValide = true; GregorianCalendar gc = new GregorianCalendar(); int jourDansLeMois; // Nombre de jours dans chaque mois int dom[] = { 31, 28, 31, 30, /* jan feb mar apr */ 31, 30, 31, 31, /* may jun jul aug */ 30, 31, 30, 31 /* sep oct nov dec */ }; // Si le mois saisie n'est pas situé entre 1 et 12 if ((mois < 1) || (mois > 12)){ estValide = false; } else{ // Nombre de jours du mois saisie jourDansLeMois = dom[mois-1]; // Si l'année est bissextile et le mois est février on ajoute un jour if (gc.isLeapYear(annee) && (mois == 2)) ++jourDansLeMois; // Si le jour saisie n'est pas situé entre 1 et le nombre de jour dans le mois if ((jour < 1) || (jour > jourDansLeMois)){ estValide = false; } } return estValide; }
Tu sais ma méthode est très simple, tu appliques une vérification basée sur une expression régulière à un String, date au format JJ/MM/AAAA.
Das ton cas ça reviendrait à faire:
Ca checke les années bissextiles, la validité j/m/a, bref que du tou bon.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 date_to_check = "" + jour + "/" + mois + "/" annee String DatePattern = "^[...]"; if(date_to_check.matches(DatePattern)) return true; else return false;
Si tu préfères utiliser ta méthode, aucun problème
Bon courache
Ok j'ai testé isLenient ca marche nickel (année bissextile compris)
Les messages d'exceptions indique même d'ou vient l'erreur ("MONTH", "DAY_OF_MONTH")
Ne pas oublié que pour un objet Calendar les mois commence à 0 et les jours à 1
Exemple (estValide est à true car 2004 est une année bissextile)
Voila merci à tous...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 Boolean estValide = true; Calendar c = Calendar.getInstance(); c.setLenient(false); c.set(2004,01,29); try{ c.getTime(); } catch(IllegalArgumentException iAE){ estValide = false; }
Un dernier post pour dire que la méthode de CitizenM marche effectivement et une remarque sur isLenient():
L'erreur n'est pas relevé los du c.set() mais lors de l'utilisation de l'objet calendar (dans l'exemple c.getTime()).
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager