f:convertDateTime显示错误date

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

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

10年4月20日

所以有一天的差距!

我添加了“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的表字段!

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

谢谢Tom

JSF默认为date/时间转换器的UTC时区。 要覆盖这个,你需要在每个date/时间转换器中设置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>标签。

根据JSF规范,f:convertDateTime默认为UTC时区(不pipe是否有VM时区设置),与您的时区相差-1小时(标准时间)或-2小时(夏令时)。

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

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

然后我们使用ELexpression式中的属性:

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

好处是它自动考虑标准/夏令时。

您可能遇到了时区问题。

检查这篇文章如何解决它们。

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

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

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