这有点棘手好吧。
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()
无法处理的变体。