【问题标题】:Java: local date time with unknow suffixJava:带有未知后缀的本地日期时间
【发布时间】:2019-09-04 18:35:26
【问题描述】:

我有一个时间戳 2019-09-02T09:42:05+0000。最后一部分 +0000 是什么意思以及如何将此时间戳转换为 LocalDateTime 对象?

LocalDateTime.parse("2019-09-02T09:42:05", DateTimeFormatter.ISO_LOCAL_DATE_TIME)

完美运行。我无法为 2019-09-02T09:42:05+0000

找到合适的格式化程序

【问题讨论】:

  • +0000 是时区偏移量。我建议您仔细阅读有关ISO 8601 日期格式的维基百科页面。
  • 由于你的字符串包含一个 UTC 偏移量(这就是 +0000 的含义),OffsetDateTime 是一个比 LocalDateTime 更好的 matxh,我建议你解析它。如果您知道您希望您的LocalDateTime 在哪个时区,则可以随后转换为LocalDateTime
  • 后续转换为LocalDateTime 始终是可能的。你的意思是ZonedDateTime? @OleV.V.
  • 是的,时间戳告诉您这是 UTC(或 GMT)时间。将其解析为它所说的内容。像这样解析代码也适用于使用其他偏移量的时间戳。

标签: java datetime timestamp datetime-format


【解决方案1】:

请改用 ISO_OFFSET_DATE_TIME 选项。该时间戳有一个偏移量,因此您需要使用正确的格式化程序。

LocalDateTime.parse("2019-09-02T09:42:05+0000", DateTimeFormatter.ISO_OFFSET_DATE_TIME)

文档: https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html#ISO_OFFSET_DATE_TIME

【讨论】:

  • 不幸的是:无法在索引 19 处解析文本“2019-09-02T09:42:05+0000”
【解决方案2】:

与 UTC 的偏移量

最后一部分+0000是什么意思

该部分是+00:00 的缩写版本。这是小时数和分钟数(以及可选的秒数)。该数字是日期时间领先于 UTC(向东)或落后于 UTC(向西)的时间量。零偏移量表示 UTC 本身。

顺便说一句,冰岛的时区恰好使用了零偏移量。

LocalDateTime代表片刻

如何将此时间戳转换为 LocalDateTime 对象?

你没有。

LocalDateTime 是错误的类。您的输入字符串代表一个时刻,即时间轴上的一个特定点。相比之下,LocalDateTime 缺少任何偏移或区域的概念,无法代表片刻。这在 Javadoc 类中有所说明。

那么我们什么时候使用LocalDateTime,只使用它的日期和时间?三个原因:

  • 我们正在描述在多个时区单独应用的一天中的时间。也许我们想在德里、杜塞尔多夫和底特律的每个工厂都放半天假。我们会在备忘录结束时写下所有工厂将在2020-01-23T12:00:00 关闭。这意味着每个地方的中午,中午首先到达德里要早得多,然后几个小时后到达杜塞尔多夫,最后几个小时后到达底特律。
  • 我们正在预约。世界各地的政治家都表现出惊人的改变各自时区偏移的倾向。因此,如果在考虑任何此类更改后,下一次牙科预约是在下午 3 点进行,那么请通过LocalDateTimeZoneId 进行预约,每个都单独存储。在时间轴上构建具有特定点的日历时间表时,通过组合两个存储的部分来动态实例化 ZonedDateTime
  • 当时区或偏移量未知时。坦率地说,我认为这个案子不合适。如果打算使用区域或偏移量但未确定,则您的数据不正确。这就像在不知道要使用哪种货币的情况下存储产品的价格一样。

有关更多信息,请参阅此问题,What's the difference between Instant and LocalDateTime?

OffsetDateTime

相反,您应该解析为OffsetDateTime

您应该能够直接解析该字符串,因为它符合 java.time 类中默认使用的 ISO 8601 标准。不幸的是,OffsetDateTime 可能仍然有一个小错误,即默认情况下无法解析偏移量中的可选冒号已被省略的值。请参阅此问题,Cannot parse String in ISO 8601 format, lacking colon in offset, to Java 8 Date

所以我们需要指定一个格式化模式:"uuuu-MM-dd'T'HH:mm:ss.SSSX"

OffsetDateTime.parse( 
    "2018-02-13T10:20:12.120+0000" , 
    DateTimeFormatter.ofPattern( "uuuu-MM-dd'T'HH:mm:ss.SSSX" )
)

【讨论】:

    猜你喜欢
    • 2010-10-16
    • 1970-01-01
    • 2018-10-28
    • 1970-01-01
    • 2020-03-09
    • 1970-01-01
    • 1970-01-01
    • 2012-10-29
    • 2019-10-27
    相关资源
    最近更新 更多