在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解释不同?
答案 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}}即可。