【问题标题】:f:convertDateTime doesn' modify the displayed datef:convertDateTime 不修改显示的日期
【发布时间】:2013-08-03 12:33:57
【问题描述】:

重新编辑

我有一个带有“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”。有没有效果?

【问题讨论】:

  • 我不确定您的setLastUpdate() 是否有意义。结果总是与输入相同。数据库本身的时区不是完全错误吗?
  • 嗨 BalusC,我编辑了我的问题,修复了 set 方法的代码。但正如我所说,我仍然走错了时间......

标签: jsf-2


【解决方案1】:

我总是使用Greenwich Mean Time 作为参考来设置它。从这里出发,you just add or deduct ours 将其修复为您当前的时区。这对您来说是一种解决方法:

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

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

<mytag:customDate value="#{bean.date}" />

【讨论】:

  • GMT-2 替换Europe/Zurich 究竟如何解决OP 的具体问题?
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-27
    • 2011-03-31
    相关资源
    最近更新 更多