索引 0 处的 DateTimeParseException 和 ThreeTenABP

DateTimeParseException at index 0 with ThreeTenABP

提问人: 提问时间:1/17/2020 最后编辑:Molly 更新时间:1/19/2020 访问量:108

问:

我正在尝试使用 ThreeTenABP 解析时间字符串(因为我必须支持 min SDK 19)。我认为字符串是 ISO 8601:

20200117T172638.000Z

我收到以下异常:

org.threeten.bp.format.DateTimeParseException: Text '20200117T172638.000Z' could not be parsed at index 0

我的代码:

Instant instant = Instant.parse("20200117T172638.000Z");
long time = instant.getEpochSecond();

任何帮助表示赞赏。提前致谢。

Android ISO8601 日期时间解析 threetenabp

评论


答:

0赞 user10981072 1/17/2020 #1

看起来我只需要在字符串中添加 和 。-:2020-01-17T17:26:38.000Z

太糟糕了,它不接受原始字符串。

0赞 Anonymous 1/18/2020 #2

这有点棘手。

    DateTimeFormatter instantFormatter = DateTimeFormatter.ofPattern("uuuuMMdd'T'HHmmss.SSSX");
    String s = "20200117T172638.000Z";
    Instant instant = instantFormatter.parse(s, Instant.FROM);
    System.out.println(instant);

此代码片段的输出为

2020-01-17T17:26:38Z

如果按照您的问题工作,请获取自纪元以来的秒数,所以我不会重复它。Instant

使用描述输入字符串精确格式的格式化程序。由于没有接受 a 作为第二个参数的方法,我们需要使用(泛型)方法以相反的方式进行解析。我们需要将查询传递给该方法,因为向后移植是为没有方法引用的 Java 版本开发的。(使用 Java 8 及更高版本的原生 java.time,我们将改用方法引用 )。Instant.parseDateTimeFormatterDateTimeFormatter.parse(CharSequence, TemporalQuery<T>)Instant.FROMInstant::from

我知道您的字符串是 ISO 8601 格式。而且我知道据说 java.time 类在没有任何显式格式化程序的情况下解析 ISO 8601 格式(我自己已经在 Stack Overflow 上写过很多次了)。这并不完全正确:java.time 的类解析了 ISO 8601 格式最常见的变体,而没有任何显式格式化程序。ISO 8601 具有相当多的语法自由,有些是始终允许的,有些是可以选择在交换 ISO 8601 格式的各方之间达成一致的。对不起,您遇到了无法处理的变体。Instant.parse()