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>
- Criteria.DISTINCT_ROOT_ENTITY vs Projections.distinct
- 使用Log4j XMLconfiguration文件configurationHibernate日志logging?
- JPA和Criteria API – 只select特定的列
- Java是否有使用声明?
- Hibernate和Scala
- Hibernate,@SequenceGenerator和allocationSize
- Hibernate和Spring Data JPA有什么区别?
- Spring事务和hibernate.current_session_context_class
- hibernate标准限制和/或组合