1

我有一个 Oracle 数据库,其中有时间戳字段,但没有存储时区。

我们开发的一个全球 JSF 应用程序正在英国、美国和瑞典使用——我们同意我们将使用服务器时间保存日期,并使用服务器时间显示日期。

我只是在托管 bean 中使用 new Date() 创建日期戳,然后将它们存储在 Oracle 中。

我在 Oracle 有个约会:

21-AUG-13 12.24.13.125000000

我希望在 JSF 中显示这个日期。我们知道这是服务器时间,即 UTC+2。

JSF 和 Primefaces 将其呈现为:

21/08/2013 11:24

所以似乎要减去一小时。

我进入运行 tomcat 的 linux 实例,“日期”给了我:

Thu Sep 19 16:25:45 CEST 2013

并为一个新的 Date() 实例做一个 System.out.println,我得到:

Thu Sep 19 15:25:45

我会假设在托管 bean 中创建一个 Date() 实例将使用托管 tomcat 的 linux 服务器上的日期,但晚了一小时......

我知道日期没有时区成分,但假设 UTC....

所以我可能正在读回一个实际上是 UTC+2 的日期到一个日期实例中,它假设这是 UTC+0 ......然后不知何故 JSF,看到服务器在 UTC+2 运行,减去 2 小时让我回到UTC!

任何关于它在哪里下降的建议,以及为什么 new Date() 与 linux date shell 值不匹配,我们将不胜感激。

问候

一世

4

1 回答 1

0

好的,谢谢...根据链接,这似乎使事情变得不那么混乱:

<context-param>
    <param-name>javax.faces.DATETIMECONVERTER_DEFAULT_TIMEZONE_IS_SYSTEM_TIMEZONE</param-name>
    <param-value>true</param-value>
</context-param>

试图了解 oracle 到 tomcat 到 jsf 之间的流程中发生了什么。

我在 Oracle 中有一个日期(非时间戳值),保存在 2013 年 9 月 20 日的托管 bean 日期实例中......我的 tomcat 服务器是 UTC+2。JSF 在我的 ouputLabel 中将日期显示为前一天...2013 年 9 月 19 日。

Tomcat日志

default system timezone is sun.util.calendar.ZoneInfo[id="Europe/Stockholm",offset=3600000,dstSavings=3600000,useDaylight=true,transitions=119,lastRule=java.util.SimpleTimeZone[id=Europe/Stockholm,offset=3600000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=2,startMonth=2,startDay=-1,startDayOfWeek=1,startTime=3600000,startTimeMode=2,endMode=2,endMonth=9,endDay=-1,endDayOfWeek=1,endTime=3600000,endTimeMode=2]]

jsf

    <h:outputLabel value="#{customerTasksBean.travelTask.travelDate}" rendered="#{customerTasksBean.renderTravel}">
        <f:convertDateTime pattern="dd-MMM, yyyy" />
  </h:outputLabel>

是不是 JSF 知道我的服务器是 UTC+2,所以要更正为 UTC,它会从我 2013 年 9 月 20 日的日期减去 2 小时,并在 JSF 转换期间将其推到前一天?在我看来,日期没有 UTC 组件,那么为什么它会尝试将 UTC+0 的日期转换为其他日期呢?

问候

一世

于 2013-09-19T16:31:17.107 回答