2015-09-03 60 views
1

我以我的存儲服務器上的時間戳在UTC時間使用DateTime喬達時間和Hibernate - 日期越來越不存儲在UTC

// @Entity .. 
@NotNull 
@Column(name="DATE") 
@Type(type="org.jadira.usertype.dateandtime.joda.PersistentDateTime") 
private DateTime date; 

在服務器開機我這樣做:

DateTimeZone.setDefault(DateTimeZone.UTC); 

確保new DateTime()總是會在UTC時間,這是我如何準備的日期得到存儲:

DateTime utc = new DateTime(); 
utc = utc.dayOfMonth().roundFloorCopy(); 

DateTime thisMonday = utc.withDayOfWeek(DateTimeConstants.MONDAY); 
DateTime thisTuesday = thisMonday.plusDays(1); 

如果我正在調試,我會看到例如

2015-08-31 00:00:002015-09-01 00:00:00

但我看看我看到

2015-08-31 02:00:002015-09-01 02:00:00

得到存儲在那裏的數據庫。它是+ 2h這是我本地的UTC抵消(柏林/維也納)。

爲什麼會發生這種情況,我如何確保我的服務器存儲所有UTC時間?

回答

1

您正在使用Jadira將JodaTime類型轉換爲SQL日期/時間類型。使用這些JPA/Hibernate屬性將數據發送到數據庫

<properties> 
    <property name="jadira.usertype.javaZone" value="UTC" /> <!-- or "jvm" to use your default JVM TZ, explicit Europe/Berlin or +02:00 etc. --> 
    <property name="jadira.usertype.databaseZone" value="UTC" /> <!-- or "jvm" to use your default JVM TZ or +02:00 etc. But you'd better not use an explicit TZ with a DST change --> 
</properties> 

Jadira User Guide的細節告訴Jadira應適用哪個時區。

其他的事情是,也許你的數據庫正在使用你的連接信息來顯示你的時區的時間戳?這取決於它是哪個數據庫以及您用於連接的工具。 SQL Developer(用於Oracle DB)知道您的計算機的TZ並將連接TZ設置爲此。