1

我正在尝试使用 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();

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

4

2 回答 2

0

这有点棘手好吧。

    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()无法处理的变体。

于 2020-01-18T15:53:06.563 回答
0

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

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

于 2020-01-17T04:31:46.920 回答