Dans mon application Web, je récupère des données à l'aide d'Hibernate et les affiche dans un tableau de données RichFaces.
Dans ma table MySQL, il y a un champ de type "date". Lorsque j'imprime ce champ dans le journal de mon Bean, il affiche la date correcte de la base de données (par exemple 2010-04-21). Mais dans les riches: dataTable, il apparaît comme ceci:
20/04/10
Il y a donc un écart d'un jour!
J'ai ajouté le convertisseur "f: convertDateTime" et défini l'attribut "type" sur "both" afin d'afficher également l'heure. Alors maintenant, cela montre:
20/04/10 22:00:00
Le code pour "f: convertDateTime" que j'ai utilisé:
<f:convertDateTime locale="locale.US" type="both" dateStyle="short"/>
Il semble donc que f: convertDateTime rêve un peu de temps car il n'y a pas d'informations temporelles dans le champ MySQL-table!
Qu'est-ce que je fais mal? Que dois-je faire pour afficher la bonne date?
Merci Tom
JSF utilise par défaut le fuseau horaire UTC pour les convertisseurs de date/heure. Pour remplacer cela, vous devez définir l'attribut timeZone
dans chaque convertisseur date/heure. Voici un exemple utilisant le fuseau horaire EDT (en supposant que vous êtes à l'est des États-Unis).
<f:convertDateTime locale="en_US" type="both" dateStyle="short" timeZone="EDT" />
L'attribut locale
contrôle uniquement la mise en forme complète du nom jour/mois (il devient anglais).
Si vous souhaitez remplacer le fuseau horaire UTC par défaut comme fuseau horaire par défaut de la plate-forme d'exploitation, vous devez ajouter le paramètre de contexte suivant à web.xml
:
<context-param>
<param-name>javax.faces.DATETIMECONVERTER_DEFAULT_TIMEZONE_IS_SYSTEM_TIMEZONE</param-name>
<param-value>true</param-value>
</context-param>
Ensuite, vous n'avez pas besoin de modifier chaque JSF individuel <f:convertXxx>
tag.
Selon les spécifications JSF, f: convertDateTime prend par défaut le fuseau horaire UTC (quel que soit le paramètre de fuseau horaire VM), qui diffère de votre fuseau horaire de -1 heure (heure standard) ou -2 heures (été temps).
Nous utilisons un bean de page de portée d'application avec une propriété timeZone comme ceci:
public TimeZone getTimeZone() {
return TimeZone.getDefault();
}
Ensuite, nous utilisons la propriété dans une expression EL:
<ice:outputText value="#{deliveryDate}">
<f:convertDateTime type="both" timeZone="#{Application.timeZone}" />
</ice:outputText>
L'avantage est qu'il envisage automatiquement l'heure standard/d'été.
Vous rencontrez probablement des problèmes avec les fuseaux horaires.
Consultez cet article sur la façon de les résoudre.
Avant cela, vous pouvez essayer de définir explicitement l'attribut timeZone
de <f:convertDataTime>
<h:outputText id="dateId" value="#{item.date}">
<f:convertDateTime for="dateId" type="date" dateStyle="long" locale="pl"/> </h:outputText>
Nous avons eu le même problème et nous avons fini par écrire un nouveau convertisseur JSF qui utilise un SimpleDateFormat créé avec new SimpleDateFormat(String pattern)
pour la conversion de date.