1

在 postgres 9.2 我有一个带有时间戳的列

CREATE TABLE pilot
(
  id bigint NOT NULL,
  birthdate timestamp without time zone NOT NULL,
  firstname character varying(50) NOT NULL,
  CONSTRAINT pilot_pkey PRIMARY KEY (id )
)

我直接使用带有 Hibernate 的 java main 插入了一些行:

    for (int i = 0; i < 10; i++) {
        Pilot p = new Pilot();
        p.setBirthdate(new Date());
        p.setFirstname("Johnson_" +tabchar[i] );
        em.persist(p);
    }

我的财产看起来像这样:

@Temporal(TemporalType.TIMESTAMP)
@Column(name = "birthdate", nullable = false, unique = false)
public java.util.Date getBirthdate() {
    return birthdate;
}

JSF2 插入了一些行并中继到休眠:我正在使用 JSF 2.1.13

    <h:form id="formPilot">
        <h:panelGrid columns="2">
            <h:outputLabel value="#{appMsg['pilot.firstname']}" />
            <h:inputText id="firstname" label="#{appMsg['pilot.firstname']}" value="#{pilotHolder.pilot.firstname}"
                required="true" />

            <h:outputLabel value="#{appMsg['pilot.birthdate']}" />
            <h:inputText id="birthdate" label="#{appMsg['pilot.birthdate']}" value="#{pilotHolder.pilot.birthdate}"
                required="true">
                <f:convertDateTime pattern="dd/MM/yyyy HH:mm:ss" timeZone="GMT+1"/>
            </h:inputText>

        </h:panelGrid>
        <h:commandButton id="merge" action="#{pilotAction.doMerge}"
            value="#{pilotHolder.pilot.id ne null ? appMsg['pilot.update'] : appMsg['pilot.create']}" />
    </h:form>   

在数据库中一切正常,所有日期都正确(小时数正常)

但是,当我显示 Pilot 列表并在页面上显示它们时,Hibernate 在没有 JSF 的情况下插入的日期有一个少 1 小时的错误,而不是我用 JSF 插入的时间戳?

        <h:column>
            <f:facet name="header">
                <h:outputText value="#{appMsg['pilot.birthdate']}" />
            </f:facet>
            <h:outputText value="#{p.birthdate}" >
               <f:convertDateTime pattern="dd/MM/yyyy HH:mm:ss" timeZone="GMT+1"/>
            </h:outputText>
        </h:column>

奇怪的是,我在使用 DBvisualizer 的数据库中没有任何区别,它们看起来都很相似,如果我在 Hibernate 获取它们之后打印日期,一切都很好。

如果我仔细查看 Hibernate 插入并取回的日期,它们包含一个字段 cdate 不是 Gregorian$Date 类型的空值。由 JSF 插入并取回的日期具有 cdate=null。

为什么?为什么 JSF2 对它们的解释不同?

4

1 回答 1

3

我认为这与DAYLIGHT SAVING TIME相关

试试这个web.xml

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

或者你可以告诉使用f:dateTimeConverter哪个timeZone。只需使用Time Zone不使用夏令时的。

于 2012-10-04T13:23:19.810 回答