JSF convertDateTime呈现前一天

时间:2012-09-10 11:59:39

标签: java jsf date jsf-2

日期(作为日期时间类型)存储在我的数据库中,如下所示:31.10.2012
当我在UI中显示它时,默认情况下会像这样呈现:2012-10-31
我使用<f:convertDateTime pattern="dd.MM.yyyy" />进行转换,然后意外转为
30.10.2012

使用相同日期和相同格式字符串的SimpleDateconverter按预期返回31.10.2012

我错过了什么?

谢谢

编辑:对于存储为Timestamp的日期,相同的转换会产生正确的结果,所以我认为它与Date有关,被解释为确切的午夜,而后者可能被解释为属于2个不同的日子。但我仍然不知道在哪里定义行为以及什么是最好的解决方法。

1 个答案:

答案 0 :(得分:79)

这无疑是与时区有关的问题。

JSF在日期/时间转换中默认为GMT(UTC)。因此,如果您的服务器平台默认时区是GMT + X(不是GMT-X),则时间将返回过去的X小时数。如果时间已经是00:00:00(午夜),则日期甚至会在过去的某一天返回。

无论如何,有两种标准方法可以实现您的功能要求:

  1. 通过将以下上下文参数添加到web.xml,告诉JSF使用服务器平台默认时区代替所有日期/时间转换:

    <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的时区。当你在德国工作时,日期格式模式也证实了这一点,我将假设是CET。

    <f:convertDateTime ... timeZone="CET" />
    
  3. 在任何情况下,都不建议在整个应用程序中使用非通用或甚至混合的时区。建议将所有层和环境中的时区设置为UTC。不仅在服务器和前端层和表示层,而且在SQL数据库和后端层和持久层中。这样代码对时区和DST(!)相关事项不敏感,如果需要,您可以专注于仅在演示期间更改时区。

    另见: