Primefaces日历时区处理到固定的后端时区



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

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

backingbean中的交付日期被转换为服务器的时区(在我使用CEST的情况下是JBoss(。后端希望日期和时间始终为UTC(并以UTC提供(。因此,当我存储一个日期时,我必须将CEST日期转换为UTC并保存它。如果一个日期是从后端传递的,那么它就是UTC。我必须将其转换为系统默认值(JBoss with CEST(,日历将确保它在客户端上正确显示。这是正确的吗?我对此有点困惑。服务器时区是可变的,不能硬设置为UTC或其他什么。例如,来自客户的日期总是转换为CEST。不管我在web.xml中将什么设置为javax.faces.DATETIMECONVERTER_DEFAULT_TIMEZONE_IS_SYSTEM_TIMEZONE

我使用的是带有JBoss 6.4 的素数面5.2.13和Mojarra 2.2.12

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

现在关键是:java.util.Date不包含任何时区信息。内部总是GMT。JSF知道这一点。JDBC知道这一点。JPA知道这一点。只要您告诉JSF视图使用的时区,并告诉JDBC/JPA DB使用的时区即可,那么一切都应该是好的。

也许你的困惑是因为你做了类似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"))));

最新更新