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

package javax.faces.convert;
...
public class DateTimeConverter implements Converter, StateHolder {
...
private static final TimeZone TIMEZONE_DEFAULT = TimeZone.getTimeZone("GMT");
...
}

Ainsi, il faudrait préciser le fuseau horaire dans toutes les pages affichant des dates si on souhaite en utiliser un autre.

<h:outputText value="#{bean.date}">
<f:convertDateTime timeZone="Europe/Paris"/>
</h:outputText

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


import java.util.TimeZone;
import javax.faces.convert.DateTimeConverter;
public class MyDateTimeConverter extends DateTimeConverter {
public MyDateTimeConverter() {
super();
setTimeZone(TimeZone.getDefault());
}
}

et de faire en sorte qu'il devienne le converter par défaut :

<converter>
<converter-for-class>java.util.Date</converter-for-class>
<converter-class>MyDateTimeConverter</converter-class>
</converter>

Aucun commentaire: