f:convertDateTime显示错误的日期

Tom*_*Tom 48 java jsf hibernate richfaces jsf-2

在我的Web应用程序中,我使用Hibernate检索数据并将其显示在RichFaces dataTable中.

在我的MySQL表中有一个类型为"date"的字段.当我将此字段打印到我的Bean中的日志时,它会显示数据库中的正确日期(例如2010-04-21).但在富人:dataTable中,它显示如下:

一零年四月二十零日

所以有一天的差异!

我添加了"f:convertDateTime"转换器并将"type"属性设置为"both"以便显示时间.现在它显示:

4/20/10 10:00:00 PM

我用过的"f:convertDateTime"代码:

<f:convertDateTime locale="locale.US" type="both" dateStyle="short"/>
Run Code Online (Sandbox Code Playgroud)

所以看起来像f:convertDateTime梦想有一段时间,因为MySQL-table字段中没有时间信息!

我究竟做错了什么?要显示正确的日期,我需要做什么?

谢谢汤姆

Bal*_*usC 113

对于日期/时间转换器,JSF默认为UTC时区.要覆盖它,您需要timeZone在每个日期/时间转换器中设置属性.以下是使用EDT时区的示例(假设您位于美国东部).

<f:convertDateTime locale="en_US" type="both" dateStyle="short" timeZone="EDT" />
Run Code Online (Sandbox Code Playgroud)

locale属性仅控制完整的日/月名称格式(它变为英语).

如果要将默认UTC时区覆盖为操作平台默认时区,则需要将以下上下文参数添加到web.xml:

<context-param>
    <param-name>javax.faces.DATETIMECONVERTER_DEFAULT_TIMEZONE_IS_SYSTEM_TIMEZONE</param-name>
    <param-value>true</param-value>
</context-param>
Run Code Online (Sandbox Code Playgroud)

然后,您不需要编辑每个单独的JSF <f:convertXxx>标记.

  • context-param在JSF 2.0之前不起作用,不是吗?一篇关于此的文章:http://planet.jboss.org/post/step_right_up_and_select_your_time_zone (3认同)
  • @Mulmoth:这是正确的,但这绝对不会对OP造成问题,因为问题标签提示他/她已经在使用JSF 2.0. (2认同)

Zee*_*mee 16

根据JSF规范,f:convertDateTime默认为UTC时区(无论任何VM时区设置),它与您的时区相差-1小时(标准时间)或-2小时(夏令时).

我们使用带有timeZone属性的应用程序作用域页面bean,如下所示:

public TimeZone getTimeZone() {
    return TimeZone.getDefault();
}
Run Code Online (Sandbox Code Playgroud)

然后我们在EL表达式中使用该属性:

<ice:outputText value="#{deliveryDate}">
    <f:convertDateTime type="both" timeZone="#{Application.timeZone}" />
</ice:outputText>
Run Code Online (Sandbox Code Playgroud)

优点是它自动考虑标准/夏令时.


Boz*_*zho 4

您可能遇到时区问题。

查看这篇文章以了解如何解决它们。

在此之前,您可以尝试显式设置timeZone属性<f:convertDataTime>