JSF2格式与同一postgres时间戳列的日期不同

时间:2012-10-04 10:05:30

标签: jsf date jsf-2

在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将一些行插入到hibernate: 我正在使用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>   

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

但是当我显示飞行员列表并在页面上显示时,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类型的null。 JSF插入并取回的日期有一个cdate = null。

为什么呢? 为什么它们被JSF2解释不同?

1 个答案:

答案 0 :(得分: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。 只需使用不使用夏令时的{{1}}即可。