48 votes

f:convertDateTime affiche une date erronée

Dans mon application Web, je récupère des données à l'aide d'Hibernate et je les affiche dans une table de données RichFaces.

Dans ma table MySQL, il y a un champ de type "date". Lorsque j'imprime ce champ sur le journal dans mon Bean, il affiche la date correcte de la base de données (par exemple 2010-04-21). Mais dans la rich:dataTable, elle s'affiche comme suit :

4/20/10

Il y a donc une différence d'un jour !

J'ai ajouté le convertisseur "f:convertDateTime" et défini l'attribut "type" sur "both" afin d'afficher également l'heure. Maintenant, il s'affiche :

4/20/10 10:00:00 PM

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 de temps parce qu'il n'y a pas d'information sur l'heure dans le champ de la table MySQL !

Qu'est-ce que je fais de mal ? Que dois-je faire pour afficher la bonne date ?

Merci Tom

113voto

BalusC Points 498232

JSF utilise par défaut le fuseau horaire UTC pour les convertisseurs date/heure. Pour remplacer cette valeur, vous devez définir l'option 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" />

En locale ne contrôle que le formatage du nom complet du jour/mois (il devient anglais).

Si vous souhaitez remplacer le fuseau horaire UTC par défaut par le fuseau horaire par défaut de la plate-forme d'exploitation, vous devez ajouter le paramètre contextuel suivant à l'élément suivant web.xml :

<context-param>
    <param-name>javax.faces.DATETIMECONVERTER_DEFAULT_TIMEZONE_IS_SYSTEM_TIMEZONE</param-name>
    <param-value>true</param-value>
</context-param>

Ainsi, vous n'avez pas besoin de modifier chaque JSF individuel. <f:convertXxx> étiquette.

16voto

Zeemee Points 2519

Selon les spécifications JSF, f:convertDateTime utilise par défaut le fuseau horaire UTC (indépendamment de tout paramètre de fuseau horaire VM), qui diffère de votre fuseau horaire de -1 heure (heure standard) ou de -2 heures (heure d'été).

Nous utilisons une application scopée page bean 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 prend automatiquement en compte l'heure normale/estivale.

4voto

Bozho Points 273663

Vous avez probablement des problèmes avec les fuseaux horaires.

Consultez cet article sur la manière de les résoudre.

Avant cela, vous pouvez essayer de définir explicitement l'option timeZone l'attribut de <f:convertDataTime>

0voto

silb Points 11

Nous avons eu le même problème et avons fini par écrire un nouveau convertisseur JSF qui utilise un SimpleDateFormat créé avec new SimpleDateFormat(String pattern) pour la conversion de la date.

0voto

Tomasz Points 16
<h:outputText id="dateId" value="#{item.date}">
 <f:convertDateTime for="dateId" type="date" dateStyle="long" locale="pl"/>   </h:outputText>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X