【发布时间】:2021-05-01 21:49:26
【问题描述】:
我有一个 SQL Server 数据库,其中某些列的类型为 datetime,但只存储时间部分都为零的日期。
在 WebSphere Portal 上运行的 Java Web 应用程序使用 JSF 和 Hibernate 来读取 SQL 数据并输出到 HTML。上述日期列的日期显示为前一天。哪个组件导致了这个问题,我应该如何解决它?
实现细节如下。
SQL Server 中的列的类型为datetime,包含2020-02-01 00:00:00.000 之类的数据。
Hibernate 表定义将此作为键列,类型为 java.sql.Timestamp。
<key-property name="contractBeginDate" column="Contract_Begin" type="java.sql.Timestamp" length="23">
<meta attribute="field-description">
@hibernate.property
column="Contract_Begin"
length="23"
</meta>
</key-property>
获取数据的Hibernate查询定义如下。
<query name="getSalesConsultantServiceContractsSold_agreementDate_asc" cacheable="false"><![CDATA[
FROM VServiceAgreementsList vsal
WHERE vsal.slmsCode = :slmsCode
AND vsal.teamEliteYear = :year
ORDER BY vsal.contractBeginDate ASC
]]></query>
表的 Java 类对字段使用 java.util.Date 类型,对列使用 get 方法。
最后,带有支持 bean 的 JSP 文件生成 HTML 输出,以下内容包含在 dataTable 的列中。
<h:outputText id="text8" value="#{varServiceAgreementSalesList.contractBeginDate}" styleClass="outputText">
<f:convertDateTime pattern="dd/MM/yyyy" />
</h:outputText>
上面给出的数据示例输出为31/01/2020,比正确日期早一天。
我认为以某种方式涉及时区差异。
所有用户都在澳大利亚,并且可能将他们的 PC 时区设置为从 UTC+8 到 UTC+11,因此原始值可能被解释为本地时区,转换为 UTC(前一天) ,然后有时间被切断。
【问题讨论】:
-
我对您的组件了解不多,无法回答,但我可以说的是,如果您使用 JSON 将日期时间值发送到浏览器,然后将其转换为 JavaScript 对象,它将自动由当地时区调整。它是一个正确的 PITA。所以不确定这是否是你所面临的,但只是把它扔在那里。
-
“所有用户都在澳大利亚,并且可能将他们的 PC 时区设置为从 UTC+8 到 UTC+11” 仅供参考:Java/JSF 在网络服务器中运行,而不是在网络浏览器。
标签: jsf timezone date-conversion