2009-09-24 37 views
9

數據庫UTC中有數據,當我試圖讓數據的Java的ResultSet如何在UTC getTimeStamp

java.util.Calendar cal = Calendar.getInstance(); 
cal.setTimeZone(TimeZone.getTimeZone("UTC")); 
java.sql.Timestamp ts = resultSet.getTimestamp(PUBLISH_TIME); 
cal.setTime(ts); 

這有什麼問題呢?

+3

你告訴我們,你是問這個問題的人。你真的嘗試過了嗎?它不會給你所期望的結果嗎?如果是,那麼你期望什麼,它給出了什麼結果?當你使用自己的查詢工具時,數據庫告訴你什麼? – kdgregory 2009-09-24 01:27:40

+1

是的,我嘗試過,是的,它沒有給出我期待的結果。數據庫具有UTC值,並且此代碼進一步將+8添加到DB中已有的值。 – kal 2009-09-24 01:48:57

+0

我的意思是+8小時 – kal 2009-09-24 01:49:36

回答

6

您的DateFormat實例最有可能在本地時間顯示值。當顯示你的價值,讓這個嘗試:

java.util.Calendar cal = Calendar.getInstance(); 
cal.setTimeZone(TimeZone.getTimeZone("UTC")); 
java.sql.Timestamp ts = resultSet.getTimestamp(PUBLISH_TIME); 
cal.setTime(ts); 

SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss z"); 
sdf.setTimeZone(TimeZone.getTimeZone("UTC")); 
System.out.println(sdf.format(cal.getTime())); 

編輯:您的評論:

如果我使用GMT,那會是一個問題的SimpleDateFormat

SimpleDateFormat能使用通用時區(GMT +/- n),RFC822和文本(「如果它們具有名稱」作爲JavaDoc狀態 - 有關名稱的信息,請參閱this post)。

+0

如果我使用GMT,那會是SimpleDateFormat – kal 2009-09-24 08:49:28

+0

中的問題,請參閱我在帖子中的編輯。 – akf 2009-09-24 12:59:00

24
java.util.Calendar cal = Calendar.getInstance(); 
cal.setTimeZone(TimeZone.getTimeZone("UTC")); 
java.sql.Timestamp ts = resultSet.getTimestamp(PUBLISH_TIME, cal); 

這應該是訣竅!

+2

這應該被標記爲正確的答案;) – Kirby 2012-07-27 16:11:20

+0

請注意,根據文檔http://docs.oracle.com/javase/6/docs/api/java/sql/ResultSet.html#getTimestamp%28int,% 20java.util.Calendar%29只有當底層數據庫沒有存儲時間戳信息 – arahant 2013-03-05 14:16:46

+0

@arahant時,如果底層數據庫存儲時區(而不是時間戳)信息,那麼就沒有問題,因爲時間戳會在正確的時區。問題是時間戳存儲在沒有時區信息的UTC中,因爲Java將使用本地計算機的時區來構造時間戳記對象。 – Paul 2013-03-11 15:55:41