【问题标题】:JSF convertDateTime renders the previous dayJSF convertDateTime 呈现前一天
【发布时间】:2012-09-03 07:02:32
【问题描述】:

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

SimpleDateconverter 使用相同的日期和相同的格式字符串返回 31.10.2012,正如预期的那样。

我错过了什么?

谢谢

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

【问题讨论】:

    标签: java jsf date jsf-2


    【解决方案1】:

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

    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. 更改每个 &lt;f:convertDateTime&gt; 以明确指定特定于 web 应用程序的时区。由于您位于德国,并且日期格式模式也证实了这一点,因此我假设 CET。

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

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

    另见:

    【讨论】:

    • 两种方法都有效,我将使用第一种。非常感谢。
    • 不客气。不过要小心,它必须与数据库时区“同步”,否则您将来可能会再次撞到时区墙。
    • 该应用程序仅供德国医疗保险内部使用,我可以肯定它永远不会跨时区部署:)。顺便说一句,感谢伟大的资源链接
    • 选项 1 对我不起作用,但选项 2 完成了工作。非常感谢!
    • @user:如果您使用的是 JSF 1.x,或者系统时区实际上未设置为所需的时区,则选项 1 将不起作用。
    猜你喜欢
    • 2013-10-02
    • 1970-01-01
    • 2018-04-09
    • 2013-12-15
    • 2011-02-05
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多