Le temps de la Java
Par Fred le lundi 5 septembre 2011, 16:05 - Développement - Lien permanent
Mon ami ''Vibi'', ayant peu dormi ces dernières 48 heures, est venu cet après-midi me soumettre une incompréhension du comportement de la classe SimpleDateFormat de Java.
Il lui a suffi de me dicter son code pour se rendre compte de l'erreur qui, finalement, est assez cocasse et décrit un comportement totalement non documenté :D
Voici le code soumis :
import java.text.SimpleDateFormat; import java.util.Date; public class testDate { public static void main(String[] args) { SimpleDateFormat sdf_l = new SimpleDateFormat("MM_dd_yy"); String dateStr_l = "21_12_12"; Date date_l = new Date(); try { date_l = sdf_l.parse(dateStr_l); } catch(Exception ex_l) { System.out.println("Blam !!"); } System.out.println("my date = " + date_l); } }
Le but du code sus-cité est parser
une chaîne de caractères pour créer un objet Date.
Sauf que c'est là qu'on voit qu'il a mal dormi[1], la chaîne de caractères ne respecte pas le format demandé et c'est là que cela devient drôle.
On pourrait s'attendre à un renvoi d'exception[2] et ce n'est pas ce qui se passe !! L'objet Date est bel et bien créé.
Vous vous demandez alors incrédule :
C'est quoi le 21ème mois de l'année ?
Et bien, notre petite classe sympa de formatage est incapable de tester ses bornes et donc de voir si le nombre dépasse la durée normale d'un mois.
Le 21ème mois de l'année, il s'agit en fait du 9ème de l'année suivante :D
Si j'étais pas cool, je donnerais maintenant un lien sur l'équivalent en Ada, genre un truc comme ça. Mais bon, il n' y a pas de système de formattage dans la norme, à part The format is "Year-Month-Day Hour:Minute:Second", where the Year is a 4-digit value, and all others are 2-digit values
.
Ca donnerai presqu'envie d'en faire un équivalent... On verra si j'en ai le courage :D