web-dev-qa-db-de.com

f: convertDateTime zeigt falsches Datum an

In meiner Webanwendung rufe ich Daten mit dem Ruhezustand ab und zeige sie in einer RichFaces-Datentabelle an.

In meiner MySQL-Tabelle gibt es ein Feld vom Typ "Datum". Wenn ich dieses Feld in das Protokoll in meinem Bean drucke, wird das korrekte Datum aus der Datenbank angezeigt (z. B. 21.04.2010). Aber in der Rich: dataTable sieht es so aus:

20.04.10

Es besteht also eine Abweichung von 1 Tag!

Ich habe den Konverter "f: convertDateTime" hinzugefügt und das Attribut "type" auf "both" gesetzt, um auch die Zeit anzuzeigen. So, jetzt zeigt es:

20.04.10 22:00 Uhr

Den Code für "f: convertDateTime" habe ich verwendet:

<f:convertDateTime locale="locale.US" type="both" dateStyle="short"/>

Es scheint also, als ob f: convertDateTime sich etwas Zeit lässt, weil das MySQL-Tabellenfeld keine Zeitinformationen enthält!

Was mache ich falsch? Was muss ich tun, um das richtige Datum anzuzeigen?

Vielen Dank, Tom

48
Tom

JSF verwendet standardmäßig die UTC-Zeitzone für Datums-/Zeitkonverter. Um dies zu überschreiben, müssen Sie das timeZone -Attribut in jedem Datum/Uhrzeit-Konverter festlegen. In diesem Beispiel wird die EDT-Zeitzone verwendet (vorausgesetzt, Sie befinden sich im Osten der USA).

<f:convertDateTime locale="en_US" type="both" dateStyle="short" timeZone="EDT" />

Das Attribut locale steuert nur die vollständige Formatierung des Tages-/Monatsnamens (wird zu Englisch).

Wenn Sie die Standard-UTC-Zeitzone als Standard-Zeitzone für die Betriebssystemplattform überschreiben möchten, müssen Sie web.xml Den folgenden Kontextparameter hinzufügen:

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

Dann müssen Sie nicht jedes einzelne JSF-Tag <f:convertXxx> Bearbeiten.

113
BalusC

Gemäß den JSF-Spezifikationen wird für f: convertDateTime standardmäßig die UTC-Zeitzone verwendet (unabhängig von der Einstellung VM Zeitzone)), die sich von Ihrer Zeitzone um -1 Stunde (Standardzeit) oder -2 Stunden (Sommerzeit) unterscheidet Zeit).

Wir verwenden ein Application-Scoped-Page-Bean mit einer timeZone-Eigenschaft wie folgt:

public TimeZone getTimeZone() {
    return TimeZone.getDefault();
}

Dann verwenden wir die Eigenschaft in einem EL-Ausdruck:

<ice:outputText value="#{deliveryDate}">
    <f:convertDateTime type="both" timeZone="#{Application.timeZone}" />
</ice:outputText>

Der Vorteil ist, dass die Standard-/Sommerzeit automatisch berücksichtigt wird.

16
Zeemee

Wahrscheinlich haben Sie Probleme mit den Zeitzonen.

Überprüfen Sie diesen Artikel wie man sie löst.

Vorher können Sie versuchen, das timeZone -Attribut von <f:convertDataTime> Explizit festzulegen.

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

Wir hatten das gleiche Problem und schrieben einen neuen JSF-Konverter, der ein mit new SimpleDateFormat(String pattern) erstelltes SimpleDateFormat für die Datumskonvertierung verwendet.

0
silb