【问题标题】:java.sql.Timestamp: changing timezone of Timestampjava.sql.Timestamp:更改时间戳的时区
【发布时间】:2011-12-20 07:11:01
【问题描述】:

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

【问题讨论】:

    标签: java


    【解决方案1】:

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

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

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

    如果您的数据创建不正确,那么可能有也可能没有“更正”它的方法 - 例如,由于夏令时更改,可能会出现一些歧义。但是,我们对它了解得越多,就越能为您提供帮助。

    【讨论】:

    • 感谢 Jon 的回答,但有 getTimezoneOffset(),这是 Timestamp 中不推荐使用的方法,它以分钟为单位返回与 GMT 的偏移量,在我的情况下它返回为 360 分钟。期望的结果是将其更改为 0,这将是 GMT 时间戳的情况。
    • @abson: getTimezoneOffset 继承自 Date - 它总是相对于系统默认时区。它根本不是对象的一部分,也不应该使用。
    • 时区偏移肯定会影响结果。我在数据库中有两个时间戳。一个在 DST 之前,一个在 DST 之后。如果我使用 Timestamp 的 getTime() 作为其构造函数参数创建一个 Calendar 对象,则它适用于 DST 之前的时间戳,但不适用于 DST 之后的时间戳。尽管使用 Calendar.getInstance(TimeZone.getTimeZone("UTC")) 实例化 Calendar 对象,但它错误地“纠正”了一小时
    • 我的问题似乎是 Oracle 的特性。似乎你需要在获取时间戳时传递一个具有所需时区的日历对象(例如 resultSet.getTimestamp("last_update_time_utc", calendar))这是一个有用的链接解释东西:puretech.paawak.com/2010/11/02/…
    • Archive.org 备份之前评论的失效链接:web.archive.org/web/20130924231308/http://puretech.paawak.com/…
    【解决方案2】:

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

    【讨论】:

    • Timestamp 上的 Javadoc 没有提及,但根本原因是它扩展了 Date 对象并将其用于构造。
    猜你喜欢
    • 2017-07-04
    • 2017-11-18
    • 2015-04-20
    • 1970-01-01
    • 1970-01-01
    • 2013-08-17
    • 2014-04-19
    • 1970-01-01
    • 2021-08-12
    相关资源
    最近更新 更多