2016-02-05 97 views
0

我在另一個時區(美國,中央)使用的是我不控制的Oracle服務器。有一個包含DATE列的表格,當插入東西時,它會得到一個默認值SYSDATE(即,列始終設置爲系統時間,而程序員不需要明確設置它)。使用JDBC從Oracle讀取DATE字段

我在不同的時區(美國,東海岸)。如何使用JDBC讀取此列並獲取Epoch/UTC時間?

當我呼叫getTimestamp().getTime()(在ResultSet上)時,我將時間轉換爲本地時間。也就是說,如果服務器上午10點插入了一些內容,則現在是11點(UTC時間下午4點)。當我打電話給getTimestamp().getTime()時,我得到當地時間上午10點(即UTC時間下午3點)的時間。

我有一個部分答案。

Calendar sqlServerCalendar = Calendar.getInstance(TimeZone.getTimeZone("CST")); 
long t = rs.getTimestamp("timestampcolumn", sqlServerCalendar).getTime(); 

這是不理想的,因爲我必須指定服務器的時區(我將進入設置)。但它似乎回報了我想要的答案。有沒有辦法在運行時查詢服務器的時區,而不需要設置?或者,有沒有更好的方法來做到這一點?我更喜歡一種解決方案,不必知道(通過硬編碼的值或設置)它或服務器所在的時區(因此,如果在不同的時區運行,和/或服務器移動,它將不會改變) 。

+0

你用什麼dateformat模式來檢查輸出中的時間?請確保在該代碼中設置時區(至utc) – Jan

+0

我將數字作爲long(由getTime()返回,並將其複製到www.epochconverter.com。 –

回答

0

您可以傳遞JVM參數-Duser.timezone,如java -Duser.timezone=GMT,這應該有所斬獲。但關於爲整個JVM設置時區的一個重要事項是,它會影響所有內容。

如果您只需要在檢索日期,時間或時間戳對象時設置時區。你可以不喜歡它

Calendar mycal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); 

然後在結果集

Date correctDate = resultset.getDate("Timestampcolumn",mycal); 

我相信你也應該能夠使用設定爲TimeZone.setDefault()以及時區。

+0

這看起來像是getTimestamp()。getTime ()返回一個紀元UTC時間,這也是不正確的。 –