MySQL、Java和时区

MySQL、Java和时区,java,mysql,sql,timezone,Java,Mysql,Sql,Timezone,我在MySQL数据库中有一个datetime类型字段some\u字段。我可以使用recordSet.getTimestamp(“somefield”)查询数据,它返回一个java.sql.Timestamp对象。但是,返回的值存储UTC时间。现在,如果知道时区是“美国/芝加哥”,我如何转换时间。我必须注意DST。我想你可能需要忽略时间戳的亚毫秒精度-这可能是合理的,就好像你正在转换到一个特定的时区,这意味着它是一个“人类”日期。无论如何: TimeZone zone = TimeZone.get

我在MySQL数据库中有一个datetime类型字段
some\u字段
。我可以使用
recordSet.getTimestamp(“somefield”)
查询数据,它返回一个
java.sql.Timestamp
对象。但是,返回的值存储UTC时间。现在,如果知道时区是“美国/芝加哥”,我如何转换时间。我必须注意DST。

我想你可能需要忽略时间戳的亚毫秒精度-这可能是合理的,就好像你正在转换到一个特定的时区,这意味着它是一个“人类”日期。无论如何:

TimeZone zone = TimeZone.getTimeZone("America/Chicago");
Calendar calendar = Calendar.getInstance(zone); // Also locale?
calendar.setTime(timestamp);
现在,您可以向日历询问您想要的任何值-日期、一天中的小时等

可选地,您可能需要考虑使用,这是一个更好的日期/时间API:

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

我认为你可能需要忽略时间戳的亚毫秒精度,这可能是合理的,就像你转换到一个特定的时区,这意味着它是一个“人类”日期。无论如何:

TimeZone zone = TimeZone.getTimeZone("America/Chicago");
Calendar calendar = Calendar.getInstance(zone); // Also locale?
calendar.setTime(timestamp);
现在,您可以向日历询问您想要的任何值-日期、一天中的小时等

可选地,您可能需要考虑使用,这是一个更好的日期/时间API:

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

问题现在在数据库中我有一个时间'2012-07-31 16:00:00',时区是
timezone.getTimeZone(“美国/东部”)
。但是
calendar.get(calendar.HOUR/OF\u DAY)
是17。我想那是因为我的服务器的tz是“US/Central”?我该怎么办?@seanhawk:您需要确定返回到Java代码的确切值。如果打印出
timestamp.getTime()
它会显示什么?(我明天才能帮忙,但到时候我会看看。)当时间是“2012-07-31 20:22:03”,时区是“US/Pacific”时,
timestamp.getTime()
是1343784123000,也就是“Wed,Aug 2012 01 01:22:03 GMT”(见www.onlineconversion.com/unix\u time.htm)。这意味着
resultSet.getTimestamp()
将结果视为在应用程序服务器的时区中,在我的例子中是“US/Central”。顺便说一句,
resultSEt.getTimestamp(key,cal)
得到完全相同的
Timestamp
@seanhawk:听起来你需要直接获得数据库中存储的内容。是否将数据存储为美国/中央时间?如果更改时区,是否会更改已存储数据的含义?那会很糟糕。我在数据库中有两列。一种类型是
datetime
(在MySQL中,它基本上是一个字符串,没有时区信息)。另一个是存储时区的
varchar
。数据来自全国各地,因此有不同的时区。我不想改变数据库的结构,因为它不是我的设计。我不知道其他DBMS的情况,但我觉得MySQL中的日期/时间类型非常糟糕。。。现在在数据库中我有一个时间'2012-07-31 16:00:00',时区是
timezone.getTimeZone(“美国/东部”)
。但是
calendar.get(calendar.HOUR/OF\u DAY)
是17。我想那是因为我的服务器的tz是“US/Central”?我该怎么办?@seanhawk:您需要确定返回到Java代码的确切值。如果打印出
timestamp.getTime()
它会显示什么?(我明天才能帮忙,但到时候我会看看。)当时间是“2012-07-31 20:22:03”,时区是“US/Pacific”时,
timestamp.getTime()
是1343784123000,也就是“Wed,Aug 2012 01 01:22:03 GMT”(见www.onlineconversion.com/unix\u time.htm)。这意味着
resultSet.getTimestamp()
将结果视为在应用程序服务器的时区中,在我的例子中是“US/Central”。顺便说一句,
resultSEt.getTimestamp(key,cal)
得到完全相同的
Timestamp
@seanhawk:听起来你需要直接获得数据库中存储的内容。是否将数据存储为美国/中央时间?如果更改时区,是否会更改已存储数据的含义?那会很糟糕。我在数据库中有两列。一种类型是
datetime
(在MySQL中,它基本上是一个字符串,没有时区信息)。另一个是存储时区的
varchar
。数据来自全国各地,因此有不同的时区。我不想改变数据库的结构,因为它不是我的设计。我不知道其他DBMS,但我觉得MySQL中的日期/时间类型非常糟糕。也许我应该使用
getString()
而不是
getTimestamp()
。Java的datetime API很糟糕。也许我应该使用
getString()
而不是
getTimestamp()
。Java的datetime API很糟糕。