2013-03-07 69 views
0

我有一個Java EE 5應用程序(IBM RAD,WebSphere 7.5,Oracle 11)。存儲/讀取時區相關問題使用JPA的日期

我讀,寫在我的JPA的應用程序一個日期,看起來是這樣的:

@Entity 
@Table="APPOINTMENT" 
public class Appointment implements Serializable { 
    /* ... */ 
    @Temporal(TemporalType.TIMESTAMP) 
    private Date lastUpdateTimestamp; 
    /* ... */ 
} 

每當我更新的約會,我做了...

myAppointment.setLastUpdateTimestamp(new Date()); 

..以反映更新「現在」。

有兩個WebSphere服務器,都指向同一個數據庫。

當我的本地開發機器的WebSphere存儲的更新時間,它將存儲「現在」爲:

March 7, 2013 1:30pm EST 

當生產服務器存儲的更新時間,它將存儲「現在」爲:

March 7, 2013 6:30pm GMT 

問題是時區看起來並不存儲爲時間戳的一部分。所以,當我瀏覽到我的地方(EST)機上的應用,它會顯示時間爲:

​​

...這實際上是在未來的5小時後,如果你跟我來。

我的問題是,我如何將時區與Date對象中的日期和時間一起存儲到數據庫中?

任何信息都是有用的,謝謝!

羅布

+1

這種方式是瘋狂的,回頭!如果可能,請將數據庫定義爲始終使用UTC並在客戶端正確解析。你會在五年內感謝你。 (無論如何,一個人在互聯網上的意見。)(顯然,如果你需要*能夠重新生成牆上的原始日曆,創建它的用戶看到了,你需要從某個地方獲得一些時區信息,這是生活。) – Affe 2013-03-07 18:42:16

+0

謝謝,很好的建議。它讓我考慮將日期字段更改爲long,並將myDate()。getTime()long值存儲爲UTC時間。在一天結束的時候,我做了一些其他的事情,請參閱下面的自我回答。 – 2013-03-08 17:21:26

回答

1

正確的答案,原來,是時區根本就沒有存儲在Oracle時間戳字段,有沒有辦法做到這一點。存儲之前,您必須將日期轉換爲正確的值。

爲了記錄在案,這裏的解決方法解決方案我認爲:

(一)改變了我所有的實體bean存儲日期爲長(UTC /紀元時間),而不是一個Date對象(UTC = myDate.getTime ()),並轉換爲日期以供顯示。決定它是太多的代碼更改。

(b)在寫入數據庫之前,將Date對象中的時間轉換爲GMT。因爲這種轉換髮生在太多的地方,所以也決定了這一點,並且我確信一些未來的開發人員會混淆它,或者忘記將其添加到未來的代碼增強中。

(c)我將我開發的web服務器服務器的時區設置爲GMT,發現指令here

我去了(c)。