JSF convertDateTime呈现前一天

kos*_*tja 29 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个不同的日期.但我仍然不知道在哪里定义行为以及什么是最好的解决方法.

Bal*_*usC 80

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

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>
    
    Run Code Online (Sandbox Code Playgroud)
  2. 改变每一个<f:convertDateTime>以明确指定webapp特定的时区.当你在德国工作时,日期格式模式也证实了这一点,我将假设是CET.

    <f:convertDateTime ... timeZone="CET" />
    
    Run Code Online (Sandbox Code Playgroud)

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

也可以看看:

  • 别客气.但是要小心,它必须与数据库时区"同步",否则你可能会在将来再次击中时区墙. (3认同)