JSF convertDateTime 渲染前一天

2022-09-01 12:28:24

日期(作为Date时态类型)存储在我的数据库中,如下所示:
当我在UI中显示它时,它按照默认值呈现如下:
我使用它进行转换,并且意外地它变成了31.10.20122012-10-31<f:convertDateTime pattern="dd.MM.yyyy" />
30.10.2012

输入相同日期和相同格式字符串的 返回 ,如预期的那样。SimpleDateconverter31.10.2012

我错过了什么?

谢谢

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


答案 1

这无疑是一个与时区相关的问题。

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

无论如何,有2种标准方法可以满足您的功能要求:

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

    <context-param>
        <param-name>javax.faces.DATETIMECONVERTER_DEFAULT_TIMEZONE_IS_SYSTEM_TIMEZONE</param-name>
        <param-value>true</param-value>
    </context-param>
    
  2. 更改 every 以显式指定特定于 Web 应用的时区。由于您位于德国,并且日期格式模式也证实了这一点,因此我将假设CET。<f:convertDateTime>

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

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

另请参阅:


答案 2