如何在JSF中使用自定义时区处理java.util.Date的可视化

如何在JSF中使用自定义时区处理java.util.Date的可视化,java,hibernate,jsf,time,java-8,Java,Hibernate,Jsf,Time,Java 8,我有以下情况: 用户可以使用JSF应用程序创建票据 这些票的有效期是(从到) 我有一个应用程序配置,它说明了应用程序上下文在哪个时区/分区中运行 我需要保持票证的有效性,并注意时区/ZoneID的应用程序配置可能会更改,因此之前创建的票证也应该使用正确的转换日期时间进行可视化 我想知道该怎么走?有一些自定义转换器来存储,在数据库中添加时区信息作为附加字段还是其他方法? 这个主题是特定于数据库供应商的,还是有某种通用的解决方案? 我有点困惑,也许我打算做一些人们不应该做的事情,因为我没有找到关

我有以下情况:

  • 用户可以使用JSF应用程序创建票据
  • 这些票的有效期是(从到)
  • 我有一个应用程序配置,它说明了应用程序上下文在哪个时区/分区中运行
  • 我需要保持票证的有效性,并注意时区/ZoneID的应用程序配置可能会更改,因此之前创建的票证也应该使用正确的转换日期时间进行可视化
我想知道该怎么走?有一些自定义转换器来存储,在数据库中添加时区信息作为附加字段还是其他方法? 这个主题是特定于数据库供应商的,还是有某种通用的解决方案?
我有点困惑,也许我打算做一些人们不应该做的事情,因为我没有找到关于这个主题的太多信息。

最后我找到了一个不同的解决方案,基于这样一个事实,即没有必要保留创建票证的原始时区。现在,我只需在后台bean中为日期选择器组件使用java.util.Date,并在将其推送到后端后将其转换为java.time.Instant。 为了在JSF前端实现可视化,我只需使用SimpleDataFormatter格式化java.util.Date,将时区设置为后端配置的时区

String timeZoneOffset = "GMT+0100";
TimeZone timeZone = TimeZone.getTimeZone(timeZoneOffset);
DateFormat dateTimeFormat = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss.SSSZ");
dateTimeFormat.setTimeZone(this.timeZone);
为了在JSF中显示格式化的java.util.Date对象,我使用了这样的格式化程序

<p:outputLabel id="tripEndDate" value="#{registerBean.trip.tripEndDate}">
    <f:convertDateTime pattern="yyyy-MM-dd HH:mm Z" timeZone="#{registerBean.timeZone.getID()}" />
</p:outputLabel>

这里可能有趣的另一个输入是,我在使用Hibernate将时间戳存储到DB时遇到了一些问题,因为Hibernate使用系统默认时区,因此如果您的服务器不以UTC运行,您将观察到这种时区转换