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(午夜),则日期甚至会在过去的某一天返回.
无论如何,有两种标准方法可以实现您的功能要求:
通过将以下上下文参数添加到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)改变每一个<f:convertDateTime>以明确指定webapp特定的时区.当你在德国工作时,日期格式模式也证实了这一点,我将假设是CET.
<f:convertDateTime ... timeZone="CET" />
Run Code Online (Sandbox Code Playgroud)在任何情况下,都不建议在整个应用程序中使用非通用或甚至混合的时区.建议将所有层和环境中的时区设置为UTC.不仅在服务器和前端层和表示层,而且在SQL数据库和后端层和持久层中.这样代码对时区和DST(!)相关事项不敏感,如果需要,您可以专注于仅在演示期间更改时区.