jeudi 2 octobre 2008

JSF (MyFaces) et TimeZone

Les spécifications JSF font que le fuseau horaire (timezone) par défaut d'une conversion Date -> String est le GMT.
Celui du serveur n'est pas pris en compte.
Pour MyFaces, ces spécifications sont respectées depuis les versions supérieures à 1.1.0
  1. package javax.faces.convert;  
  2. ...  
  3. public class DateTimeConverter implements Converter, StateHolder {  
  4. ...  
  5.   private static final TimeZone TIMEZONE_DEFAULT = TimeZone.getTimeZone("GMT");  
  6. ...  
  7. }  

Ainsi, il faudrait préciser le fuseau horaire dans toutes les pages affichant des dates si on souhaite en utiliser un autre.
  1. <h:outputText value="#{bean.date}">  
  2.  <f:convertDateTime timeZone="Europe/Paris"/>  
  3. </h:outputText  

Fastidieux!
Le plus simple est d'écrire son propre DateTimeConverter :

  1. import java.util.TimeZone;  
  2. import javax.faces.convert.DateTimeConverter;  
  3. public class MyDateTimeConverter extends DateTimeConverter {  
  4.   public MyDateTimeConverter() {  
  5.     super();  
  6.     setTimeZone(TimeZone.getDefault());  
  7.   }  
  8. }  

et de faire en sorte qu'il devienne le converter par défaut :
  1. <converter>  
  2. <converter-for-class>java.util.Date</converter-for-class>  
  3. <converter-class>MyDateTimeConverter</converter-class>  
  4. </converter>