【问题标题】:How can I parse RFC 3339 date string into ZondeDateTime?如何将 RFC 3339 日期字符串解析为 ZonedDateTime?
【发布时间】:2019-03-23 18:10:03
【问题描述】:

问题:

我应该解析一个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"

问题:

  • 如何解析它以避免丢失任何时间?

更新:

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

【问题讨论】:

  • “避免丢失任何秒数”到底是什么意思?我不认为 java.time 支持闰秒,例如ZonedDateTime.getSeconds() 被记录为返回 0-59(含)范围内的值。如果它在 1991 年初返回午夜 UTC,你会满意吗?

标签: java date datetime parsing rfc3339


【解决方案1】:

java.time 不为您想要的内容提供任何直接支持。就在今天早些时候,我写了this answer,其中也有一个关于解析闰秒的部分。但所说的就是一切。

所以剩下的是手动解析。我会尝试以下方法:使用正则表达式来检测第二个是否为 60。如果是:将其替换为 59。解析。转换为 UTC。如果 UTC 时间是 23:59:59,则假设原始字符串中存在有效的闰秒;否则字符串不表示有效时间。

我建议在闰秒的情况下,最高 60.999999999 的值是有效的。因此,要检测是否有 60,您需要查看分钟后冒号(如果有)之后的内容,而不是取决于是否也有小数部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-24
    • 1970-01-01
    • 2011-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多