【问题标题】:Timezone not setted correctly during convesion from java.sql.Timestamp to joda DateTime从 java.sql.Timestamp 转换为 joda DateTime 期间时区未正确设置
【发布时间】:2015-10-26 17:07:21
【问题描述】:

在尝试将java.sql.Timestamp 类型的对象转换为时间org.joda.time.DateTime 的对象时,我正在尝试一些奇怪的问题。详细来说,时区设置不正确。

这是我的代码(scala 语言):

val receptionDate = 
  new DateTime(tuple("RECEPTION_TIMESTAMP").asInstanceOf[Timestamp].getTime(), 
               DateTimeZone.UTC)

Timestamp 对象直接从数据库表 (HBase) 中读取,SQuirreL 客户端显示的值如下:

2015-07-30 00:00:00.0

相反,创建的DateTime 对象具有值2015-07-29 22:00:00.0。显然,在创建 DateTime 对象期间,我没有使用时区 DateTimeZone.UTC 的信息,我将其传递给构造函数。

我做错了什么?哪里出错了?

【问题讨论】:

    标签: java scala datetime type-conversion jodatime


    【解决方案1】:

    此问题是由于您使用 local Timezone(UTC-2) 来存储日期而未指定 UTC 时区 ,但是当您通过设置 UTC 时区Hbase 检索您的日期时。所以它们的时间相等,但不相同Timezone

    【讨论】:

    • 感谢您的回答,但我使用的是构造函数public DateTime(long instant, DateTimeZone zone) [doc.这里]](joda-time.sourceforge.net/apidocs/org/joda/time/…, org.joda.time.DateTimeZone))。该对象应该使用我指定的DateTimeZone.UTC 创建,不是吗?
    • 是的,目前receptionDateUTC 日期。但是您需要在 HBase 中检查您的日期是否是 UTC 时区日期。对吗?
    • 在 HBase 中,日期存储为时间戳,因此根据定义它在 UTC 时区。对不起,但我没有抓住重点。如果我在对象的构造过程中指定了时区,为什么它不是 UTC?
    • 好的,现在我已经掌握了您想要对我说的内容。问题是时间戳的产生。 Timestamp 对象是在没有指定时区的情况下创建的,然后它表示从 1970 年 1 月 1 日开始的毫秒,即我的时区中的日期,即 UTC-2。如果我使用这个时间戳来构建一个指定 UTC 时区的DateTime 对象,我将获得一个对象,该对象代表一个比原始日期晚 2 小时的日期。如果您修改了答案并详细说明了这一点,我会接受。
    • 酷@riccardo.cardin
    猜你喜欢
    • 2013-10-20
    • 2018-04-07
    • 1970-01-01
    • 2016-06-19
    • 2021-09-09
    • 1970-01-01
    • 1970-01-01
    • 2011-07-06
    • 2013-04-06
    相关资源
    最近更新 更多