【问题标题】:How to deal with visualization of java.util.Date with a custom timezone in JSF [duplicate]如何在 JSF 中使用自定义时区处理 java.util.Date 的可视化 [重复]
【发布时间】:2025-12-06 03:45:02
【问题描述】:
我有以下场景:
- 用户可以使用它来创建票证的 JSF 应用程序。
- 这些票有有效期(从-到)
- 我有一个应用程序配置,其中说明了应用程序上下文在哪个 TimeZone/ZoneID 中运行。
- 我需要保持工单的有效性,并注意 TimeZone/ZoneID 的应用程序配置可能会更改,因此之前创建的工单也应该使用正确的转换日期时间进行可视化
我想知道要走的路是什么?有一些自定义转换器来存储,将时区信息添加为数据库中的附加字段或其他方法?
这个主题数据库供应商是特定的还是有某种通用解决方案?
我有点疑惑,也许我打算做一些不应该做的事情,因为我没有找到关于这个话题的太多信息。
【问题讨论】:
标签:
java
hibernate
jsf
time
java-8
【解决方案1】:
最后我找到了一个不同的解决方案,基于不需要保留创建票证的原始时区这一事实。我现在只需将支持 bean 中的 java.util.Date 用于日期选择器组件,并在将其推送到后端后立即将其转换为 java.time.Instant。
出于 JSF 前端的可视化目的,我只是使用 SimpleDateFormatter 格式化 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 中运行,您将观察到这个时区转换