JSF convertDateTime呈现前一天
date(如date时间types)存储在我的数据库中,如下所示: 31.10.2012
当我在UI中显示它时,默认情况下呈现如下: 2012-10-31
我转换它使用<f:convertDateTime pattern="dd.MM.yyyy" />
并意外地转向
30.10.2012
如预期的那样, SimpleDateconverter
使用相同的date和相同的格式string返回31.10.2012
。
我错过了什么?
谢谢
编辑:作为Timestamp
存储的date相同的转换产生正确的结果,所以我想这是有关的Date
解释为确切的午夜,而这可能会被解释为属于2个不同的日子。 但我仍然不知道在哪里定义行为,什么是最好的解决方法。
这无疑是一个与时区有关的问题。
JSF在date/时间转换中默认为GMT(UTC)。 所以如果你的服务器平台的默认时区是GMT + X(不是GMT-X),那么时间将会回到过去的X小时。 如果时间已经是00:00:00(午夜),那么这个date甚至会在过去的某一天回退。
有两种标准的方式来实现你的function要求:
-
通过将以下上下文参数添加到
web.xml
告诉JSF使用服务器平台默认时区来代替所有date/时间转换:<context-param> <param-name>javax.faces.DATETIMECONVERTER_DEFAULT_TIMEZONE_IS_SYSTEM_TIMEZONE</param-name> <param-value>true</param-value> </context-param>
-
修改每个
<f:convertDateTime>
以明确指定特定于webapp的时区。 因为你在德国,date格式也证实了这一点,我会承担CET。<f:convertDateTime ... timeZone="CET" />
无论如何,在整个应用程序中使用非通用时区或混合时区是不可取的。 build议将所有图层和环境中的时区设置为UTC。 不仅在服务器和前端层和表示层,还在SQL数据库和后端层和持久层。 这样,代码对时区和DST(!)相关的事件就不敏感了,如果需要的话,您可以只关注在演示期间更改时区。
也可以看看:
- 夏令时和时区最佳实践