索引 0 处的 DateTimeParseException 与 ThreeTenABP

DateTimeParseException at index 0 with ThreeTenABP

我正在尝试使用 ThreeTenABP 解析时间字符串(因为我必须支持最低 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 与您的问题一样工作,则获取自纪元以来的秒数,因此我不再重复。

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

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