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要求:

  1. 通过将以下上下文参数添加到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> 
  2. 修改每个<f:convertDateTime>以明确指定特定于webapp的时区。 因为你在德国,date格式也证实了这一点,我会承担CET。

     <f:convertDateTime ... timeZone="CET" /> 

无论如何,在整个应用程序中使用非通用时区或混合时区是不可取的。 build议将所有图层和环境中的时区设置为UTC。 不仅在服务器和前端层和表示层,还在SQL数据库和后端层和持久层。 这样,代码对时区和DST(!)相关的事件就不敏感了,如果需要的话,您可以只关注在演示期间更改时区。

也可以看看:

  • 夏令时和时区最佳实践