2010-07-20 3 views
0

Essayez ceci:explication pour le comportement de SimpleDateFormat

DateFormat df = new SimpleDateFormat("y"); 
System.out.println(df.format(new Date())); 

Sans lire la javadoc pour SimpleDateFormat, que voulez-vous attendre à ce que la sortie? Mon attente était "0". C'est-à-dire, le dernier chiffre de l'année en cours, qui est 2010.

À la place, il le remplit à 2 chiffres, comme si la chaîne de format avait été "yy".

Pourquoi? Semble plutôt bizarre. Si j'avais voulu 2 chiffres alors j'aurais utilisé "yy".

Répondre

5

"Sans lire la javadoc" est une attitude dangereuse le plus souvent. Joshua Bloch wrote a book on this comportements étranges en Java.

+1

True. En cas de doute, consultez la documentation. Surtout quand il est aussi bien écrit que Java. Il est bon d'examiner les choses au début, mais une fois que cela ne fonctionne pas, il faut immédiatement regarder la documentation. – musiKk

0

Si vous voulez seulement un chiffre, vous pouvez:

System.out.println(df.format(new Date()).substring(1)); 

:)

+1

C'est essentiellement ce que j'ai fini par faire. C'était agaçant parce que je voulais créer un DateFormat et l'utiliser de manière agnostique, par ex. faites-le injecter ailleurs et appelez seulement "format()". Pour ce faire et toujours obtenir une fonctionnalité à un chiffre, je dois sous-classer SimpleDateFormat. – jph

4

C'est pourquoi vous devez vérifier the documentation:

Pour l'analyse syntaxique avec le motif de l'année abrégé (« y » ou « yy »), SimpleDateFormat doit interpréter l'année abrégée par rapport à un siècle. "Y" est une abréviation, donc ceci est un comportement attendu.

+0

J'ai lu la documentation après avoir échoué à faire ce que je m'attendais. J'ai vu cette ligne. Donc, oui, cela fonctionne comme documenté. Ma question était plus, "Pourquoi diable at-il été conçu de cette façon?" – jph

+0

@ user190758: Je suppose que les concepteurs de l'API pensaient qu'un chiffre de l'année n'était pas informatif ou était trop ambigu, donc ils en ont fait un raccourci. J'ai l'habitude de penser à des années à 2 ou 4 chiffres, donc je ne sais pas ce que la plupart des gens attendent d'un seul chiffre. FWIW, je pense que votre doc utilise «1. Essayez-le dans le code. 2. Observez le résultat. 3. Vérifiez le document si nécessaire. »Est assez typique. C'est normalement ce que je fais aussi. –

+0

Je suis d'accord que le modèle de développement est typique et nécessaire à certains moments, mais il peut être dangereux. Lorsque l'étape 2 réussit en raison d'une pure coïncidence, les programmeurs secondaires ne prennent pas la peine de consulter les docs pour apprendre que leur méthode échouera le week-end, ou avec plusieurs threads, ou sur Linux, ou quand la bibliothèque sera mise à jour, etc. appel de jugement (vous ne voulez pas lire tous les docs de chaque méthode) mais en cas de doute, il est probablement préférable de se tromper sur le côté prudent et de produire un code plus robuste un peu plus lent. –

Questions connexes