【问题标题】:After Parsing timestamp contains timezone to Date object, does Date object contain timezone information解析时间戳包含时区到日期对象后,日期对象是否包含时区信息
【发布时间】:2017-03-03 07:35:01
【问题描述】:

如果我们有包含时区信息的时间戳,例如 2017-07-03T17:30:00-04:00,并将其解析为 java.Date 或 joda.DateTime。

它是否包含时区信息? 我问这个是因为我想比较两个不同的日期实例。所以如果不包含时区信息,不同时区的天差会出错

更新: 我运行了一个快速单元测试来验证,首先将日期实例转换为毫秒,然后在减去这两毫秒后转换回 TimeUnit。不同时区的营业时间不同

【问题讨论】:

  • 这两个类的javadoc是怎么说的?
  • 我觉得应该根据计算天差的方式,先转换成毫秒,再用毫秒比较这两个日期。但是,我运行了一个快速的单元测试,它给了我不同时区的不同时间

标签: java date datetime


【解决方案1】:

java.util.Date 和 Joda-Time 都已被 java.time 类取代。

您的输入字符串 2017-07-03T17:30:00-04:00 采用标准 ISO 8601 格式,末尾有一个与 UTC 的偏移量。 -04:00 表示该字符串表示比 UTC 晚四个小时的时刻。

此偏移量不是时区。时区是特定区域的偏移历史记录。例如,America/BarbadosAmerica/New_York

将您的字符串解析为java.time.OffsetDateTime 对象。

OffsetDateTime odt = OffsetDateTime.parse( "2017-07-03T17:30:00-04:00" );

odt.toString(): 2017-07-03T17:30:00-04:00

您可以通过调用IsEqualisBeforeisAfter 方法来比较OffsetDateTime 实例。

要查看 UTC 中的同一时刻,请提取 Instant

Instant instant = odt.toInstant() ;

instant.toString(): 2017-07-03T21:30:00Z

末尾的ZZulu 的缩写,表示UTC。

【讨论】:

    【解决方案2】:

    这将取决于您使用的DateTime 类型,从 Java 8 开始,您有以下选项:

    • LocalDateLocalDateTime。它将丢弃时区信息,您将得到一个仅对本地时区“有效”的值。如果没有关于生成该值的服务器进程的特定时区的上下文,该值是不明确的。
    • ZonedDateZonedDateTime。这个保留时区。比较仍然是模棱两可的:您需要应对 DST 或日历更改等问题(取决于您需要兼容的日期时间范围)。出于排序/比较目的,您可能希望将其转换为参考时间刻度,这就是为什么:
    • Instant 表示在 UTC 绝对时间尺度上的特定时刻。任何Instant 都可以与任何其他Instant 直接比较,并且值中的任何歧义都通过Instant 的定义来解决。输入值将转换为 UTC 中的匹配对应项,因此即使正确保留绝对时间值,原始时区(如果有)也会丢失。因此,例如,如果您依赖时区来决定位置或语言环境,Instant 就不是一个好的选择。

    【讨论】:

      猜你喜欢
      • 2021-08-24
      • 2013-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多