【发布时间】:2011-12-20 07:11:01
【问题描述】:
如何将最初实例化为 CST 的 java.sql.Timestamp 对象的时区更改为 GMT?
【问题讨论】:
标签: java
如何将最初实例化为 CST 的 java.sql.Timestamp 对象的时区更改为 GMT?
【问题讨论】:
标签: java
java.sql.Timestamp 对象没有有时区 - 它们是时间的瞬间,例如 java.util.Date。
如果您认为它们处于特定时区,您可能会因为误导性输出而感到困惑(例如,使用默认时区自动将该时刻转换为本地时间的东西),或者您可能已经创建了以不适当的方式获取数据。您需要的答案将取决于您的具体情况。
例如,如果您只想在特定时区显示 Timestamp 值,您可以使用SimpleDateFormat,适当设置时区,然后格式化Timestamp (因为它扩展了Date)。我认为这不会让您显示与内部存储的时间戳一样多的精度,但这可能对您来说不是问题。
如果您的数据创建不正确,那么可能有也可能没有“更正”它的方法 - 例如,由于夏令时更改,可能会出现一些歧义。但是,我们对它了解得越多,就越能为您提供帮助。
【讨论】:
getTimezoneOffset 继承自 Date - 它总是相对于系统默认时区。它根本不是对象的一部分,也不应该使用。
某些 Timestamp 构造函数确实依赖于默认时区。 避免这种情况的一种方法是使用需要很长时间的构造函数:
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
【讨论】: