2010-04-22 24 views
46

En mi aplicación web recupero datos usando Hibernate y los visualizo en una tabla de datos RichFaces.f: convertDateTime muestra incorrectamente Fecha

En mi tabla MySQL hay un campo de tipo "fecha". Cuando imprimo este campo en el registro de mi Bean, muestra la fecha correcta de la base de datos (por ejemplo, 2010-04-21). Sin embargo, en los ricos: dataTable que aparece así:

4/20/10

por lo que hay una diferencia del 1 día!

Agregué el convertidor "f: convertDateTime" y establecí el atributo "tipo" en "ambos" para mostrar la hora también. Por lo que ahora se muestra:

4/20/10 10:00:00 PM

el código para "f: convertDateTime" He usado:

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

Por lo tanto, Parece que f: convertDateTime sueña un tiempo porque no hay información de tiempo en el campo de la tabla MySQL.

¿Qué estoy haciendo mal? ¿Qué debo hacer para mostrar la fecha correcta?

Gracias Tom

Respuesta

2

Usted probablemente está teniendo problemas con las zonas horarias.

Check this article sobre cómo resolverlos.

Antes de eso, puede intentar establecer explícitamente el atributo timeZone de <f:convertDataTime>

+0

He intentado establecer el atributo timeZone de pero ahora el tiempo dice 11 PM (porque mi zona horaria es GMT + 1). Parece que está configurando mi hora por defecto a las 10PM UTC. – Tom

+0

e intentaste las otras opciones? – Bozho

+0

Sí. Establecí la zona horaria en ServletContextListener, pero el resultado fue (por supuesto) el mismo. El problema central es que inventa valores de tiempo para mi valor de fecha (solo hay una fecha, no hay tiempo). Sin embargo, la solución alternativa que utilizo actualmente es establecer la zona horaria en GMT + 2, de modo que la salida sea el 21/04/10 00:00:00 en lugar del 20/04/10 22:00:00. Pero esa no es una solución ideal :) – Tom

0

Tuvimos el mismo problema y terminamos con la escritura de un nuevo convertidor de JSF que utiliza un SimpleDateFormat creada con new SimpleDateFormat(String pattern) para la conversión de la fecha.

14

De acuerdo con las especificaciones JSF, f: convertDateTime se establece de forma predeterminada en la zona horaria UTC (independientemente de la configuración de la zona horaria de la VM), que difiere de su zona horaria -1 hora (hora estándar) o -2 horas (horario de verano).

se utiliza un grano de página de la aplicación de ámbito con una propiedad timeZone así:

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

A continuación, utilizamos la propiedad en una expresión EL:

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

La ventaja es que es considerando estándar/horario de verano de forma automática.

+0

+1 , de manera similar, puede mostrar la hora local para los usuarios en diferentes zonas horarias – gaborsch

112

JSF está predeterminado a la zona horaria UTC para los convertidores de fecha/hora. Para anular esto, debe establecer el atributo timeZone en cada convertidor de fecha/hora. Aquí hay un ejemplo usando la zona horaria EDT (suponiendo que esté en el este de EE. UU.).

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

El atributo locale sólo controla el nombre de día completo/mes formatear (que se convierte en Inglés).

Si desea anular la zona horaria UTC por defecto para ser la plataforma de funcionamiento por defecto zona horaria, entonces es necesario agregar el siguiente parámetro de contexto para web.xml:

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

Entonces no es necesario para editar cada etiqueta individual JSF <f:convertXxx>.

+3

El parámetro de contexto no funcionará antes de JSF 2.0, ¿o sí? Un artículo sobre eso: http://planet.jboss.org/post/step_right_up_and_select_your_time_zone – Zeemee

+2

@Mulmoth: Eso es correcto, pero esto no debería ser un problema para el OP ya que las etiquetas de pregunta indican que ya está usando JSF 2.0. – BalusC

+0

Tienes razón, no vi la etiqueta. – Zeemee

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