【问题标题】:Why does JSF output change date? [duplicate]为什么 JSF 输出更改日期? [复制]
【发布时间】: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


【解决方案1】:

尝试将 websphere 位置设置为与 SQL Server 相同

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-18
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-20
    • 2015-12-16
    相关资源
    最近更新 更多