有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JSF convertDateTime渲染前一天

日期(作为日期时态类型)存储在my DB中,如下所示:31.10.2012
当我在UI中显示它时,默认情况下是这样呈现的:2012-10-31
我使用<f:convertDateTime pattern="dd.MM.yyyy" />转换它,它意外地变成了
30.10.2012

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

我错过了什么

多谢各位

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


共 (1) 个答案

  1. # 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. 更改每个<f:convertDateTime>以显式指定特定于webapp的时区。由于您的总部位于德国,并且日期格式模式也证实了这一点,我将假设CET

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

    在任何情况下,不建议在整个应用程序中使用非通用或甚至混合时区。建议将所有层和环境中的时区设置为UTC。不仅在服务器、前端层和表示层,而且在SQL数据库、后端层和持久层。这样代码对时区和DST不敏感(!)如果有必要的话,你可以只在演讲中改变时区

    另请参见: