【问题标题】:java.time.format.DateTimeParseException: Text '2021-02-19T00:45:09.798Z' could not be parsed, unparsed text found at index 23java.time.format.DateTimeParseException:无法解析文本“2021-02-19T00:45:09.798Z”,在索引 23 处找到未解析的文本
【发布时间】:2021-06-01 04:55:36
【问题描述】:

我是 java 新手,我不明白我的日期解析出了什么问题。我已经尝试了许多类似帖子的解决方案,阅读了 DateTimeFormatter 文档,但仍然卡住了。任何帮助表示赞赏。谢谢。

代码

String date = "2021-02-19T00:45:09.798Z"
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSZ");
ZonedDateTime parsedDate = ZonedDateTime.parse(date, formatter);

错误

java.time.format.DateTimeParseException: Text '2021-02-19T00:45:09.798Z' could not be parsed, unparsed text found at index 23

我也尝试过使用DateTimeFormatter.ofPattern(pattern).withZone(zone) 并收到同样的错误。

【问题讨论】:

    标签: java java-time


    【解决方案1】:

    您不需要格式化程序来解析给定的日期时间字符串,因为它已经符合ZoneDateTime#parse 期望的默认格式。

    import java.time.ZonedDateTime;
    
    public class Main {
        public static void main(String[] args) {
            String date = "2021-02-19T00:45:09.798Z";
            ZonedDateTime parsedDate = ZonedDateTime.parse(date);
            System.out.println(parsedDate);
        }
    }
    

    输出:

    2021-02-19T00:45:09.798Z
    

    Trail: Date Time 了解有关现代日期时间 API 的更多信息。


    * 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 和 7 . 如果您正在为一个 Android 项目工作,并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project

    【讨论】:

    • 由于没有时区,我会在这里使用InstantOffsetDateTime 而不是ZonedDateTime
    • @BasilBourque 从技术上讲,Z 是祖鲁时区,是 GMT 的同义词。
    • @VGR UTC/Zulu 实际上不是时区。它是定义所有时区的基准。这就是为什么 java.time 提供了与ZonedDateTime 分开的InstantOffsetDateTime 类,以及为什么常量UTC 定义在ZoneOffset 类而不是@ 987654338@上课。偏移量只是小时-分钟-秒数,正数或负数。时区更多。时区是特定地区的人们使用的偏移量的过去、现在和未来变化的历史。所以对于这个答案,ZonedDateTime 是不合适的。
    • 公平地说,还有DateTimeFormatter.ISO_INSTANT 只支持Z 和Z,总是期待Instant。因此,根据 OP 实际期望的输入类型,Instant 可能是一个选择(在ZonedDateTimeOffsetDateTime 旁边),我认为我们无法从单个可用输入中真正分辨出来。但是:Z 通常表示偏移,而不是 ZoneId,即使它也是一个很好的 ZoneId。
    【解决方案2】:

    您输入的索引 23 是 Z,时间偏移指示符。事实上,如果我们查看formatting patterns docs,我们会将“Z”视为偏移模式:

    偏移 Z: [...] 一个、两个或三个字母输出小时和分钟,不带冒号,例如 '+0130'。当偏移量为零时,输出将为“+0000”。

    和“X”作为偏移模式,而使用“Z”表示零:

    偏移 X: [...] 当要输出的偏移为零时,模式字母“X”(大写)将输出“Z” .因此,这是可行的:

    DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSX")
    

    也就是说,如果您的输入采用众所周知的 ISO 8601 标准格式,您可能希望改用其中一种预定义的格式化程序,例如 ISO_OFFSET_DATE_TIME(或其他一些,取决于您输入的 ZoneId/offset 使用情况) .

    【讨论】:

      猜你喜欢
      • 2016-10-02
      • 2019-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-10
      • 2017-12-09
      • 1970-01-01
      相关资源
      最近更新 更多