java.sql.Timestamp:更改Timestamp的时区

时间:2011-12-20 07:11:01

标签: java

如何将最初实例化为CST的java.sql.Timestamp对象的时区更改为GMT?

2 个答案:

答案 0 :(得分:15)

java.sql.Timestamp个对象没有时区 - 它们是及时的,如java.util.Date

如果您认为它们处于特定时区,您可能会因为误导输出而感到困惑(例如,使用默认时区自动将该瞬间转换为本地时间)或者您可能已创建数据以不恰当的方式进行。您需要的答案取决于您的具体情况。

例如,如果您只想在特定时区显示 Timestamp值,则可以使用SimpleDateFormat,正确设置时区,然后格式化Timestamp(因为它扩展了Date)。我不相信这会让你在内部显示与时间戳存储一样多的精度,但可能对你来说不是问题。

如果您的数据创建不正确,则可能有也可能无法“纠正”它 - 例如,由于夏令时变化,可能会出现一些歧义。但是,我们越了解它就越能帮助您。

答案 1 :(得分:8)

某些时间戳构造函数确实依赖于默认时区。 避免这种情况的一种方法是使用带有long的构造函数:

TimeZone.setDefault(TimeZone.getTimeZone("GMT"))
Timestamp.valueOf("2016-10-26 23:00:00").getTime()

res16: Long = 1477522800000 // This is what we want

TimeZone.setDefault(TimeZone.getTimeZone("GMT-1"))
Timestamp.valueOf("2016-10-26 23:00:00").getTime()

res14: Long = 1477526400000

new Timestamp(OffsetDateTime.of(2016,10,26,23,0,0,0,ZoneOffset.UTC).toInstant.toEpochMilli).getTime

res15: Long = 1477522800000 // We get the same result at in GMT