在我的Web应用程序中,我使用Hibernate检索数据并将其显示在RichFaces dataTable中。
在我的MySQL表中有一个类型为“date”的字段。当我将此字段打印到我的Bean中的日志时,它会显示数据库中的正确日期(例如2010-04-21)。但在富人:dataTable中,它显示如下:
一零年四月二十零日
因此存在1天的差异!
我添加了“f:convertDateTime”转换器并将“type”属性设置为“both”以显示时间。现在它显示:
4/20/10 10:00:00 PM
我用过的“f:convertDateTime”代码:
<f:convertDateTime locale="locale.US" type="both" dateStyle="short"/>
所以好像f:convertDateTime有一段时间,因为MySQL-table字段中没有时间信息!
我做错了什么?如何显示正确的日期?
谢谢汤姆
答案 0 :(得分:113)
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>
标记。
答案 1 :(得分: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>
优点是它正在自动考虑标准/夏令时。
答案 2 :(得分:4)
答案 3 :(得分:0)
我们遇到了同样的问题,最后编写了一个新的JSF转换器,它使用了用new SimpleDateFormat(String pattern)
创建的SimpleDateFormat进行日期转换。
答案 4 :(得分:0)
<h:outputText id="dateId" value="#{item.date}">
<f:convertDateTime for="dateId" type="date" dateStyle="long" locale="pl"/> </h:outputText>