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

java.sql.Timestamp: changing timezone of Timestamp

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


java.sql.Timestamp对象没有时区 - 它们是时间瞬间,如java.util.Date

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

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

如果您的数据创建不正确,那么可能会或可能没有办法"纠正"它 - 例如,由于夏令时变化,可能会有一些歧义。但是,我们对它的了解越多,我们就能越好地帮助您。


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

1
2
3
4
5
6
7
8
9
10
11
12
13
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