48

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

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

2010 年 4 月 20 日

所以有1天的差异!

我添加了“f:convertDateTime”转换器并将“type”属性设置为“both”以显示时间。所以现在它显示:

2010 年 4 月 20 日晚上 10:00:00

我使用过的“f:convertDateTime”代码:

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

所以看起来 f:convertDateTime 做了一段时间的梦,因为 MySQL 表字段中没有时间信息!

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

谢谢汤姆

4

5 回答 5

115

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

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

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>

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

于 2011-05-24T12:06:38.320 回答
16

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

我们使用具有 timeZone 属性的应用程序范围的页面 bean,如下所示:

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

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

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

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

于 2011-05-24T10:14:35.460 回答
4

您可能遇到时区问题。

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

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

于 2010-04-22T10:08:14.190 回答
0
<h:outputText id="dateId" value="#{item.date}">
 <f:convertDateTime for="dateId" type="date" dateStyle="long" locale="pl"/>   </h:outputText>
于 2014-01-31T13:39:21.040 回答
0

我们遇到了同样的问题,最终编写了一个新的 JSF 转换器,该转换器使用new SimpleDateFormat(String pattern)为日期转换创建的 SimpleDateFormat。

于 2011-03-21T14:58:35.717 回答