2012-07-31 49 views
1

我在MySQL數據庫中有一個日期時間類型字段some_field。我可以使用recordSet.getTimestamp("somefield")查詢數據,它將返回java.sql.Timestamp對象。但是,返回的值存儲UTC時間。現在如果知道時區是「美國/芝加哥」,我該如何轉換時間。我必須照顧DST。MySQL,Java和TimeZone

+0

也許我應該使用'getString()'而不是'getTimestamp()'。 Java的datetime API很臭。 – 2012-07-31 21:45:43

回答

1

我認爲你可能需要忽略Timestamp的亞毫秒精度 - 這可能是合理的,就好像你正在轉換到特定的時區,這表明它意味着一個「人」的日期。總之:

TimeZone zone = TimeZone.getTimeZone("America/Chicago"); 
Calendar calendar = Calendar.getInstance(zone); // Also locale? 
calendar.setTime(timestamp); 

現在你可以問你想要的任何值日曆 - 日期,星期等

另外的時間,你可能要考慮使用Joda Time,這是一個更好的日期/時間API:

DateTimeZone zone = DateTimeZone.forID("America/Chicago"); 
DateTime dateTime = new DateTime(timestamp.getTime(), zone); 
+0

問題...現在在數據庫中我有一個時間'2012-07-31 16:00:00',時區是'Timezone.getTimeZone(「US/Eastern」)'。但'calendar.get(Calendar.HOUR_OF_DAY)'是17.我認爲這是因爲我的服務器的tz是「US/Central」?我該怎麼辦? – 2012-07-31 21:27:16

+0

@seanhawk:您需要確定返回到Java代碼的確切值。如果你打印'timestamp.getTime()'它顯示了什麼? (明天我將無法提供幫助,但我會看一下。) – 2012-07-31 22:35:21

+0

當時間爲「2012-07-31 20:22:03」,時區爲「美國/太平洋」時,時間戳.getTime()'是1343784123000,即「Wed,01 Aug 2012 01:22:03 GMT」(請參閱​​www.onlineconversion.com/unix_time.htm)。這意味着'resultSet.getTimestamp()'將結果視爲它處於應用服務器的時區中,在我的情況下是「US/Central」。順便說一句,'resultSEt.getTimestamp(key,cal)'得到完全相同的'Timestamp'。 – 2012-08-01 04:05:04