f:转换日期时间显示错误的日期

2022-08-31 21:10:12

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

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

4/20/10

所以有1天的差异!

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

10-4-20 下午10:00:00

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

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

因此,似乎f:convertDateTime会梦想一段时间,因为MySQL表字段中没有时间信息!

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

谢谢汤姆


答案 1

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

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


答案 2

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

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

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

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

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

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


推荐