2011-12-20 53 views

回答

11

java.sql.Timestamp物体没有时区 - 它们是时间的瞬间,如java.util.Date

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

例如,如果你只是想显示在特定时区中的Timestamp值,则可以使用SimpleDateFormat,适当地设置时区,只是格式化Timestamp(因为它延伸Date)。我不相信这会让你显示与内部时间戳存储一样精确的数据,但可能不会对你造成问题。

如果您的数据已被错误地创建为那么可能有也可能没有办法“更正”它 - 例如,由于夏令时更改可能存在一些不明确之处。然而,我们越了解它越好,我们就能帮助你。

+2

谢谢,乔恩的答案,但有使用getTimezoneOffset(),在时间戳的方法已过时,它返回从格林尼治标准时间以分钟为单位的偏移量,在我的情况下,它返回到360分钟。期望的结果是将其更改为0,这将是GMT时间戳的情况。 – abson 2011-12-21 11:36:49

+0

@abson:'getTimezoneOffset'继承自'Date' - 它总是*相对于系统默认时区。它根本不属于对象的一部分,不应该使用。 – 2011-12-21 11:42:40

+3

时区偏移量肯定会影响结果。我在数据库中有两个时间戳。一个在DST之前,一个在DST之后。如果我使用Timestamp的getTime()作为其构造函数参数创建Calendar对象,那么对于之前的DST时间戳而不是DST之后的时间戳可以。尽管使用Calendar.getInstance(TimeZone.getTimeZone(“UTC”))来实例化Calendar对象,但它错误地将其“纠正”了一个小时 – 2013-04-04 10:43:15

1

某些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