【问题标题】:Primefaces calendar timezone handling to fixed backend timezonePrimefaces 日历时区处理到固定后端时区
【发布时间】:2015-10-09 11:59:31
【问题描述】:

在 Web 应用程序中,用户可以选择传递给日历小部件的 timezone 属性的时区:

<p:calendar value="#{curValue}" timeZone="#{settingsBL.getTimeZoneIdSet()}" />

后备 bean 中的交付日期被转换为服务器的时区(在我的例子中是 JBoss 的 CEST)。后端希望日期和时间与 UTC 一样(并以 UTC 格式提供)。 因此,当我存储日期时,我必须将 CEST 日期转换为 UTC 并保存。如果日期是从后端传递的,则它是 UTC。我必须将它转换为系统默认值(带有 CEST 的 JBoss),并且日历会注意它在客户端上正确显示。 这个对吗?我对此有点困惑。服务器时区是可变的,不能硬设置为 UTC 或其他东西。 对于我的示例,来自客户端的日期始终转换为 CEST。不管我在 web.xml 中设置什么javax.faces.DATETIMECONVERTER_DEFAULT_TIMEZONE_IS_SYSTEM_TIMEZONE

我在 JBoss 6.4 中使用 primefaces 5.2.13 和 Mojarra 2.2.12

【问题讨论】:

    标签: jsf-2 primefaces jsf-2.2


    【解决方案1】:

    任何基于java.util.Date 的JSF 组件的timeZone 属性必须设置为视图(前端)所期望的时间部分。当将 java.util.Date 实例从模型(后端)转换为 String 表示时,将使用它将嵌入到生成的 HTML 输出中。当将传入的String 请求参数值转换为将在模型中使用的具体java.util.Date 实例时,也会使用它。如果您不允许操纵时间部分,则只需坚持默认的timeZone="GMT"

    现在关键是:java.util.Date 保存任何时区信息。它在内部始终是格林威治标准时间。 JSF 知道这一点。 JDBC 知道这一点。 JPA 知道这一点。只要您告诉 JSF 视图使用哪个时区,并告诉 JDBC/JPA 数据库使用哪个时区,那么一切都会好起来的。

    也许你的困惑是因为你做了类似System.out.println(date) 的事情来验证一个和另一个。它的toString() 结果将在内部使用TimeZone#getDefault(),因此在String 生成期间不会显式使用GMT/UTC。然后,您会在系统默认时区中混淆地看到 date 正在打印。要使用 GMT 时区打印date(以便调试/记录/验证它等),请执行以下操作:

    System.out.println(DateTimeFormatter.ISO_DATE_TIME.format(date.toInstant().atZone(ZoneId.of("GMT"))));
    

    【讨论】:

    • 正确。在我的情况下,日期存储在没有任何时区的数据库中。按照约定,存储 UTC 并且读取时也是 UTC。所以也许我在这里没有问题?在我的情况下,当我在搜索掩码中选择一个月的第一天并提交时,该值是前一个月的最后一天。
    • 如果视图不使用 GMT/UTC 时区,而是使用 GMT+x 某处的时区,这确实会发生。此处说明:stackoverflow.com/questions/12351244/… 如果您也可以节省时间并从数据库返回查看,应该没有问题。或者更好的是,始终在需要仅显示/接受/选择日期(没有时间)的组件中明确指定timeZone="GMT"。没有时间,你对时区区不感兴趣吧?
    • 这是一个带有起始值和终止值的搜索。因此,起始值的时间设置为 00:00:00,结束值的时间设置为 23:59:59。所以用户只选择一个日期,但时间很重要。但是对于搜索字段的示例,我认为硬设置为 UTC 的时区应该没问题。提交后更改天的问题来自UTC到CEST的转换以及当时的转换。我没有问题……我很困惑。是时候进行另一个调试会话了。
    • 不分时区,如果需要固定时间不分时区,请将JSF组件的时区设置为GMT/UTC。
    • 这已经是默认值了(当您没有指定 timeZone 或该上下文参数时)。另请参阅上面我的第一条评论中的链接。
    猜你喜欢
    • 2016-05-09
    • 2010-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-18
    • 1970-01-01
    相关资源
    最近更新 更多