1

重新编辑

我有一个带有“lastUpdate”字段的bean,它的类型是Date,以及它通常的getter/setter。我使用 JPA 将我的 bean 保存到 PostGreSql 数据库中。

我想让我的 lastUpdate 保存在 UTC 中,所以在设置它之前,我设置了时区:

Calendar calendar = DatatypeConverter.parseDateTime( text.toString() );
calendar.setTimeZone( TimeZone.getTimeZone( "Europe/Zurich" ) );
doiPool.setLastUpdate( calendar.getTime() );

所以,如果 lastUpdate 是“2013-08-02 12:17:05”(欧洲/苏黎世),那么在数据库中我有“2013-08-02 10:17:05”(UTC),这就是我想要的。

当我显示日期时,我也想根据我的时区来拥有它,所以我想我可以使用 f:convertDateTime 并设置 timeZone="xxx"。

...
<f:facet name="header"> #{msg.dashboardColumnLastUpdate} </f:facet>
<h:outputText value="#{dashboardDoiPoolRow.doiPool.lastUpdate}">
       <f:convertDateTime pattern="yyyy-MM-dd HH:mm" timeZone="Europe/Zurich"/>
</h:outputText>
...

阅读其他答案,我试图设置

javax.faces.DATETIMECONVERTER_DEFAULT_TIMEZONE_IS_SYSTEM_TIMEZONE

也是,但结果总是一样的:通过显示我得到的日期 2013-08-02 10:17:05 而不是 2013-08-02 12:17:05。

我认为如果转换器正常工作,如果我想根据我的时区显示 2013-08-02 10:17:05 (UTC),将时区设置为我的(欧洲/苏黎世),我应该得到 2013 -08-02 12:17:05

我错过了什么吗?

在 DB 中,该列的类型为“timestamp without time zone”。有没有什么作用?

4

2 回答 2

0

在 DB 中,该列的类型为“timestamp without time zone”。

这就是问题。如果没有指定时区,转换器如何知道如何调整时间?

于 2013-08-06T11:32:29.773 回答
0

我总是使用格林威治标准时间作为参考来设置它。从这里出发,您只需添加或减去我们的时间以将其修复到您当前的时区。这对你来说是一个解决方法:

<f:convertDateTime pattern="yyyy-MM-dd HH:mm" timeZone="GMT-2"/>

如果您想避免一次又一次地指定它,您可以创建自己的facelet 标记。这样您就可以重用代码,并且在时区更改时只需更改一次。

<mytag:customDate value="#{bean.date}" />
于 2013-08-02T09:48:42.343 回答