如何将最初实例化为CST的java.sql.Timestamp对象的时区更改为GMT?
答案 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