提问人: 提问时间:1/17/2020 最后编辑:Molly 更新时间:1/19/2020 访问量:108
DateTimeParseException 在索引 0 处使用 ThreeTenABP
DateTimeParseException at index 0 with ThreeTenABP
问:
我正在尝试使用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();
任何帮助都表示赞赏。提前致谢。
答:
看起来我只需要在字符串中添加 和 。-
:
2020-01-17T17:26:38.000Z
太糟糕了,它不接受原始字符串。
这有点棘手。
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.parse
DateTimeFormatter
DateTimeFormatter.parse(CharSequence, TemporalQuery<T>)
Instant.FROM
Instant::from
我知道您的字符串是 ISO 8601 格式。而且我知道据说 java.time 类在没有任何显式格式化程序的情况下解析 ISO 8601 格式(我自己已经在 Stack Overflow 上写过很多次了)。这并不完全正确:java.time 的类解析了 ISO 8601 格式最常见的变体,而没有任何显式格式化程序。ISO 8601 具有相当多的语法自由,有些是始终允许的,有些是可以选择在交换 ISO 8601 格式的各方之间达成一致的。对不起,您遇到了无法处理的变体。Instant.parse()
评论