Montre mécanique

Petit point sur SimpleDateFormat

Publié dans Java | Marqué avec , ,
Share

Montre mécaniqueCes derniers temps, il m’est arrivé plusieurs fois de m’amuser avec une date en Java. Ma foi, ce n’est pas particulièrement compliqué, mais il faut avoir compris le principe, bref, ça vaut le coup d’y passer quelques demi heures. Par conséquent, commençons par SimpleDateFormat qui permet d’afficher facilement (puisque c’est simple !) une date comme on le souhaite.
L’idée de base est la suivante :

  • On précise un format de date avec SimpleDateFormat
  • Avec la méthode SimpleDateFormat.format, qui renvoie un String, on parse une date au format souhaité.
  • Ou alors avec la méthode SimpleDateFormat.parse qui renvoie une Date, on parse une String (au format précisé) en une date

Transformer une Date en String

Voilà pourquoi l’exemple simple (simple vous dis-je !) suivant affiche : 2010-06-24.

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
System.out.println(dateFormat.format(new Date()));

On comprend maintenant que le défi de SimpleDateFormat est simplement (puisque c’est simple !) de connaître la syntaxe à utiliser. Pour cela, référons-nous, tout simplement, à la documentation Java SimpleDateFormat ! En voici un résumé en français. Pour mes exemples j’ai pris la date du jour : le jeudi 24 juin 2010, 4ème jour de la semaine, semaine 4 du mois, 25 de l’année.

  • y : Année (yyyy donne 2010, yy donne 10)
  • M : Mois de l’année (MMMM donne juin, MM donne 06, M donne 6 sans zéro initial)
  • w : Numéro de la semaine dans l’année (ww donne 25, w donne 25 sans le zéro initial)
  • W : Numéro de la semaine dans le mois (WW donne 04, W donne 4 sans le zéro initial)
  • D : Numéro du jour dans l’année (D donne 175)
  • d : Numéro du jour dans le mois (dd donne 24, d donne 24 sans le zéro initial)
  • F : Numéro du jour dans la semaine de ce mois (F donne 4), bref une valeur de 1 à 7… (merci Arrindos pour le test)
  •  E : Jour de la semaine en lettre (EEEE donne jeudi, EE donne jeu.)

On passe aux horaires :

  • a : AM pour le matin, PM pour l’après-midi
  • H : Heure sur 24h (0-23)
  • h : Heure sur 12h (0-11)
  • K : Heure sur 24h (1-24)
  • k : Heure sur 12h (1-12)
  • m : Minute (0-59)
  • s : Seconde (0-59)
  • S : Milliseconde (0-999)
  • z : Time zone en General Standard Time (ex : Pacific Standard Time; PST; GMT-08:00)
  • Z : Time zone en RFC 822 time zone (ex : -0800)

De manière générale, en faisant varier le nombre de lettre on modifie la valeur à utiliser (pour les nombres avec ou sans zéros initials, pour le texte avec ou sans raccourci)

Du coup, le code suivant nous donne : mardi, 29 juin 2010 12:44:15

SimpleDateFormat dateFormat = new SimpleDateFormat("EEEE, d MMM yyyy HH:mm:ss");
System.out.println(dateFormat.format(new Date()));

Mais on peut aussi préciser en deuxième paramètre la langue à utiliser ! La classe Locale contient plusieurs variables static utilisables. Ainsi l’exemple suivant affiche : Tuesday, 29 Jun 2010 12:44:45

SimpleDateFormat dateFormat = new SimpleDateFormat("EEEE, d MMM yyyy HH:mm:ss", Locale.ENGLISH);
System.out.println(dateFormat.format(new Date()));

Si jamais les variables static ne vous convenez pas, on peut aussi utiliser : Local maLocale = new Local("fr", "FR");.

Transformer une String en Date

Au début de ce billet, je disais qu’on pouvait faire l’opération inverse de format avec parse. On verra dans un prochain billet comment affiner ce traitement, et pourquoi il faut l’entourer d’une exception, mais voici un exemple basique qui affiche une Date : Fri Mar 18 00:00:00 CET 1988

SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
try {
   System.out.println(dateFormat.parse("18/03/1988"));
} catch (ParseException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
}

Quelques trucs… Utiles ?

SimpleDateFormat permet l’utilisation de quelques autres méthodes qui peuvent, peut-être, être utile :

  • toLocalizedPattern : renvoie le format tel qu’il s’écrit de manière standard dans la Local (typiquement l’exemple précédent affiche : jj/MM/aaaa)
  • toPattern : renvoie le format précisé. (dd/MM/yyyy) Et c’est à peu près tout.

Pour conclure

Finalement, y en avait des choses à dire sur cette classe ! Dans de prochains billets j’aurai l’occasion de la réutiliser pour approfondir un peu le sujet. Un de ces quatre, il faudra aussi que je regarde comment fonctionne la classe mère DateFormat.

2 réponses à Petit point sur SimpleDateFormat

  1. Arrindos

    Petite erreur :

    Pour SimpleDateFormat : Pour l’année c’est y « minuscule » qui est accepté uniquement au format « yyyy » ou « yy ».

    F : Numéro du jour dans la semaine de ce mois (F donne 4) ??? J’imagine que c’est une valeur de 1 à 7… A tester Tester et approuvé! =)

    Thx !

    • C’est corrigé, merci beaucoup !

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*