2012-07-31 29 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