|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | |||
|
Futur Membre du Club
![]() Développeur Java Inscription : octobre 2009 Messages : 20 ![]() |
Bonjour à tous,
Dans mon application, les saisies de dates via l'IHM se font suivant le format "semaine/année", "ww/yyyy" en utilisant la librairie [org.apache.commons.validator.DateValidator] version jar (commons-validator-1.3.1), la validation pour la semaine "01/2013" me retourne un false !?, pas de souci avec les semaines qui suivent... ci-dessous un bout de code permettant de tester ce cas particulier (01/2013) Code :
L'execution donne ce qui suit: Citation:
D'avance, Merci à tous pour vos réponses. |
|||
|
|
00
|
|
|
#2 | ||
|
Futur Membre du Club
![]() Développeur Java Inscription : octobre 2009 Messages : 20 ![]() |
Meme résultat avec une version plus récente : commons-validator-1.4.0
Code :
resultat validation semaine [01/2012] = Mon Jan 02 00:00:00 CET 2012 resultat validation semaine [52/2012] = Mon Dec 24 00:00:00 CET 2012 resultat validation semaine [53/2013] = null resultat validation semaine [01/2013] = null resultat validation semaine [02/2013] = Mon Jan 07 00:00:00 CET 2013 |
||
|
|
00
|
|
|
#3 |
|
Membre Expert
![]() Développeur java, access, sql server Inscription : octobre 2005 Messages : 1 322 ![]() |
Qu'est-ce que ça donne avec
__________________
·· −· −−· ·· ·−· ··− −− ·· −− ··− ··· −· −−− −·−· − · · − −·−· −−− −· ··· ··− −− ·· −− ··− ·−· ·· −−· −· ·· D'abord qu'il marche. Ensuite qu'il soit rapide. Enfin qu'il soit agréable à utiliser. First, make it work. Then, make it fast. Finally, make it user-friendly. Erst, mach', dass es funktioniert. Dann, mach', dass es schnell geht, Zum Schluss mach' es benutzerfreundlich. |
|
|
00
|
|
|
#4 | |||||||
|
Futur Membre du Club
![]() Développeur Java Inscription : octobre 2009 Messages : 20 ![]() |
Citation:
ça donne null resultat validation semaine [53/2012] = null Il y a certainement un problème coté DateFormat et les méthodes de parse en dessous Code :
la classe Code :
Code :
|
|||||||
|
|
00
|
|
|
#5 | |||||
![]() ![]() |
Citation:
Demonstration code : Code :
Et on se demande bien pourquoi une erreur : on a juste demandé la première semaine de 2013. Notons au passage que sans la ligne format.setLenient(false) on a le résultat attendu. Bon, mais on ne devrait pas avoir besoin de leniency pour la date demandée. Voyons ce que dit la JavaDoc de DateFormat.setLenient() : en gros c'est juste un raccourci pour getCalendar().setLenient(false). Nouveau code de démonstration : Code :
nous avons demandé à la fois l'année 2013, la première semaine de l'année, et le lundi. Or, le lundi de la première semaine de 2013 n'est pas en 2013. Conflit. Si on veut faire des calculs de numéro de semaine avec un calendrier, il ne faut pas restreindre la leniency, puisque les semaines chevauchent les années et que leniency est contradictoire à cela. Si on ne demande pas de leniency, pas d'erreur, et on a le résultat voulu : le jour demandé étant l'année précédent l'année demandée, l'année est réajustée à 2012. Si on ne demande pas le lundi, ça dépend : le calendrier va garder le jour d'aujourd'hui, et on aura une erreur si on est lundi (dans la première semaine de 2013, seul lundi est en 2012,) et pas d'erreur un autre jour. SimpleDateFormat, bien sûr, renvoie toujours le premier jour concerné, ce qui signifie que derrière les rideaux il demande le lundi (pour nous autres français.) Mes conclusions : - Calendar n'a rien à se reprocher : les numéros de semaines sont ce qu'ils sont, setLenient() est ce qu'il est, les deux ne vont pas ensemble et ne doivent pas être mis ensemble. - SimpleDateFormat fait ce qu'il dit qu'il fait avec setLenient() : il le passe à Calendar sans se poser de question. Et du coup, on pourrait trouver que c'est pas le mieux : il devrait se poser des questions sur ce cas-là. Rappelons-nous quand même qu'un DateFormat produit des Dates, qui sont des instants dans le temps, et que le format demandé ici consiste à lire des semaines, qui ne sont pas des dates et se représentent mal comme des instants dans le temps. Les deux vont mal ensemble, et un SimpleDateFormat ne devrait sans doute pas intervenir sur cette question. Excuse qui ne va pas bien loin : parce qu'il ne marche pas mieux quand on lui indique à la fois le numéro de la semaine et un jour précis qui permet de résoudre l'ambiguïté Date <-> semaine. - DateValidator est essentiellement une surcouche de SimpleDateFormat. Même raisons mêmes conclusions : puisqu'il produit des Dates il est fatalement peu jouasse à gérer des semaines. En tout cas, puisque SimpleDateFormat le fait mal, il le fait mal aussi.
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher du poisson, il videra le lac et au bout de deux ans son village ne mangera plus jamais. Partagez vos connaissances, mais aussi comment s'en servir. |
|||||
|
|
00
|
|
|
#6 |
|
Futur Membre du Club
![]() Développeur Java Inscription : octobre 2009 Messages : 20 ![]() |
Bonjour à tous et merci pour vos réponses,
Donc, pour valider si la semaine (ww/yyyy) saisie, je devrais utiliser une autre solution qui ne s'appuie pas sur cette librairie qui est si on peut le dire boguée, Si c'est bien le cas (librairie boguée), comment remonter le bogue aux développeurs qui l'ont conçu ? |
|
|
00
|
|
|
#7 |
![]() ![]() |
C'est plutôt SimpleDateFormat qui est bogué, ou du moins, qui ne fait pas les choses de façon pratique et est plutôt contre-intuitif sur le cas rencontré.
Du coup, on pourrait dire que cette bibliothèque devrait éviter de s'en servir aussi directement. Et que le faire est un bogue, qui ne correspond pas à ce que dit sa documentation. Comment remonter l'erreur, leur site est clair. Issue Tracking ça me semble être le B. A. - BA
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher du poisson, il videra le lac et au bout de deux ans son village ne mangera plus jamais. Partagez vos connaissances, mais aussi comment s'en servir. |
|
|
00
|
|
|
#8 |
|
Futur Membre du Club
![]() Développeur Java Inscription : octobre 2009 Messages : 20 ![]() |
Merci
On peut considérer le post comme résolu. J'ai ouvert une nouvelle demande, ci-dessous le lien https://issues.apache.org/jira/browse/VALIDATOR-314 (j'attendrais ce que ça va donner avant de marquer le post comme résolu) |
|
|
00
|
|
|
#9 |
|
Expert Confirmé Sénior
![]() ![]() Développeur Java/Web Inscription : avril 2002 Messages : 12 657 ![]() |
Salut,
Je ne pense pas que ce soit un bug de Calendar ou de DateValidator, mais juste un cas particulier qui provoque un bug avec ton pattern. En effet c'est ce dernier qui me semble incorrect : "ww/yyyy" En effet "yyyy" représente l'année en cours, tandis que "YYYY" représente l'année de la semaine en cours. Bien sûr dans la plupart des cas ces valeurs sont les mêmes, mais il y a des cas particulier où cela ne l'est pas. "01/2013" renvoi le premier jour de la première semaine de 2013, soit le 31/12/2012. Or avec le pattern "ww/yyyy" l'année ne correspond plus et est corrigé en 2012, ce qui provoque une erreur avec setLenient(false) et donc avec le DateValidator. Si tu utilises le pattern "ww/YYYY", l'année correspond bien et cela ne provoque plus aucune erreur. En effet pour le 31/12/2012, "yyyy" renvoi 2012 mais "YYYY" renvoi 2013 puisqu'il fait parti de la première semaine de 2013... Bref ton pattern devrait plutôt correspondre à ceci : "ww/YYYY". Pour l’anecdote, tu n'es pas le seul à te tromper puisqu'il semble que les ingénieurs d'Apple ont fait une erreur similaire (en anglais dans le texte) : http://arstechnica.com/apple/2013/01...elf-next-week/ a++
__________________
adiGuba [ tutoriels | blog | twitter ] Rédacteur/Modérateur Java |
|
10
|
|
|
#10 | |
![]() ![]() |
Citation:
Du coup, c'est effectivement la façon prévue de résoudre l'ambiguïté de "vérification de date."
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher du poisson, il videra le lac et au bout de deux ans son village ne mangera plus jamais. Partagez vos connaissances, mais aussi comment s'en servir. |
|
|
|
00
|
|
|
#11 |
|
Expert Confirmé Sénior
![]() ![]() Développeur Java/Web Inscription : avril 2002 Messages : 12 657 ![]() |
En effet tiens je n'avais pas fait attention à cela...
Du coup en Java 1.6 il faudra bidouiller pour gérer le cas. a++
__________________
adiGuba [ tutoriels | blog | twitter ] Rédacteur/Modérateur Java |
|
00
|
|
|
#12 |
|
Futur Membre du Club
![]() Développeur Java Inscription : octobre 2009 Messages : 20 ![]() |
Bonsoir à tous,
je n'avais pas précisé que nous sommes en java5 (contraint par notre serveur weblogic) et prévu de migrer vers java6 Je viens d'essayer (sous jdk5) avec le Y au lieu du y et j'ai eu le résultat suivant: Exception in thread "main" java.lang.IllegalArgumentException: Illegal pattern character 'Y' at java.text.SimpleDateFormat.compile(SimpleDateFormat.java:696) at java.text.SimpleDateFormat.initialize(SimpleDateFormat.java:515) at java.text.SimpleDateFormat.<init>(SimpleDateFormat.java:464) at java.text.SimpleDateFormat.<init>(SimpleDateFormat.java:445) at org.apache.commons.validator.routines.AbstractCalendarValidator.getFormat(AbstractCalendarValidator.java:213) at org.apache.commons.validator.routines.AbstractCalendarValidator.parse(AbstractCalendarValidator.java:179) at org.apache.commons.validator.routines.DateValidator.validate(DateValidator.java:153) et quant à la solution de contournement mise en place, je suis passé par un split et un Integer.parseInt et une petite classe utilisant joda-time (http://joda-time.sourceforge.net/userguide.html) Merci à tous pour vos apports |
|
|
00
|
|
|
#13 | ||
|
Expert Confirmé Sénior
![]() ![]() Développeur Java/Web Inscription : avril 2002 Messages : 12 657 ![]() |
Dans ce cas tu vas devoir te passer de DateValidator.
Par exemple tu peux utiliser directement un SimpleDateFormat sans spécifier "setLenient(false)". Cela aura pour conséquence de "corriger" les dates invalides (par exemple "53/2012" te renverra la même chose que "01/2013", etc.) Si tu as vraiment besoin de vérifier que le format soit correct (et obtenir une erreur pour "53/2012" par exemple), alors le plus simple serait surement d'utiliser Calendar pour créer la date, et vérifier que le numéro de la semaine ne change pas. Par exemple : Code :
a++
__________________
adiGuba [ tutoriels | blog | twitter ] Rédacteur/Modérateur Java |
||
|
00
|
|
|
#14 |
|
Futur Membre du Club
![]() Développeur Java Inscription : octobre 2009 Messages : 20 ![]() |
Merci
|
|
|
00
|
Copyright © 2000-2013 - www.developpez.com