web-dev-qa-db-fra.com

f: convertDateTime affiche une date incorrecte

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

48
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.

113
BalusC

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é.

16
Zeemee

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>

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

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.

0
silb