java - JSF ConvertDateTime 呈现前一天

标签 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 个不同的日子。但我仍然不知道在哪里定义行为以及最好的解决方法是什么。

最佳答案

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

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>显式指定 web 应用程序特定的时区。由于您位于德国,并且日期格式模式也证实了这一点,因此我假设为 CET。

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

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

另请参阅:

关于java - JSF ConvertDateTime 呈现前一天,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31131292/

相关文章:

java - JSF 2 : How show different ajax status in same input?

jsf - 传递作为 EL 操作方法参数传递的请求范围变量不起作用

java - Jax-RS JsonFormat 日期未知 39

jquery - 日期格式jqplotcategoryaxisrenderer后添加刻度

sql - Oracle:年份必须介于 -4713 和 +9999 之间,且不能为 0

java - PDF在java swt浏览器中不显示

java - URL.openConnection() 第二次返回已经打开的连接

java - Vaadin - 从 DOM 获取输入元素值

java - 是否可以在 process() 中启动 Camel 端点

jsf - ADF AF :inputFile does not trigger ValueChangeEvent with valueChangeListener