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 メインで直接いくつかの行を挿入しました。

    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>   

DBではすべて問題ありません。すべての日付は正しいです(時間は問題ありません)

しかし、パイロットのリストを表示してページに表示すると、JSF なしで Hibernate によって挿入された日付のエラーが 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 を使用して DB に違いがないことです。それらはすべて似ています。Hibernate がフェッチした後に日付を出力すると、すべて問題ありません。

Hibernate によって挿入され、フェッチされた日付をよく見ると、Gregorian$Date 型のフィールド cdate not null が含まれています。JSF によって挿入され、取り戻された日付には、cdate=null があります。

なんで?JSF2 によって解釈が異なるのはなぜですか?

4

1 に答える 1

3

サマータイム関連だと思います

あなたの中でこれを試してください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を使用しないa を使用するだけです。

于 2012-10-04T13:23:19.810 に答える