如何将RFC 3339日期字符串解析为ZonedDateTime?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将RFC 3339日期字符串解析为ZonedDateTime?相关的知识,希望对你有一定的参考价值。

问题:

我应该解析一个RFC3339日期字符串。它适用于ISO_ZONED_DATE_TIME

ZonedDateTime.parse("1985-04-12T23:20:50.52Z", ISO_ZONED_DATE_TIME);
ZonedDateTime.parse("1996-12-19T16:39:57-08:00", ISO_ZONED_DATE_TIME);

假设我将解决一个未知的本地抵消公约问题,只是为了不接受这些日期。但我仍然遇到一些像这样的角落问题:

  1990-12-31T23:59:60Z

这代表了1990年底插入的闰秒。

  1990-12-31T15:59:60-08:00

这代表了太平洋标准时间8的相同闰秒 小于UTC的时间。“1990-12-31T15:59:60-08:00”

题:

  • 如何解析它,避免丢失任何秒数?

更新:

  • 是否存在适合RFC3339的ZonedDateTime的替代方案?
答案

java.time不提供任何你想要的直接支持。就在今天早些时候,我写了this answer,其中还有一节解析闰秒。但话说的就是有。

所以有手解析左边。我会尝试这些方法:使用正则表达式来检测秒是否为60.如果是这样:用59替换它。解析。转换为UTC。如果UTC中的时间是23:59:59,则假设原始字符串中存在有效的闰秒;否则字符串不表示有效时间。

我建议在闰秒的情况下,最高60.999999999的值是有效的。因此,为了检测是否有60,你需要在分钟后查看结肠后的内容(如果有的话),而不是依赖于是否还有分数部分。

以上是关于如何将RFC 3339日期字符串解析为ZonedDateTime?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中解析/创建格式为小数秒 UTC 时区(ISO 8601、RFC 3339)的日期时间戳?

如何解析 ISO 8601 格式的日期?

C# 对接微信支付时生成符合 RFC3339 标准的日期时间字符串

ISO 8601 和 RFC 3339 日期格式有啥区别?

如何解析 DateTime 并将其转换为 RFC 822 日期时间格式?

将 RFC3339 字符串插入 bigquery 时出错