正如 Basil 所说,您可能应该使用DateTimeFormatter.ISO_INSTANT
作为您的格式,这会导致所有成功和更准确的结果:
Success: 2021-06-22T18:27:03.5577Z {InstantSeconds=1624386423, MilliOfSecond=557, MicroOfSecond=557700, NanoOfSecond=557700000},ISO
Success: 2021-06-22T18:27:03.55770Z {InstantSeconds=1624386423, MilliOfSecond=557, MicroOfSecond=557700, NanoOfSecond=557700000},ISO
Success: 2021-06-22T18:27:03.557700Z {InstantSeconds=1624386423, MilliOfSecond=557, MicroOfSecond=557700, NanoOfSecond=557700000},ISO
Success: 2021-06-22T18:27:03.5577000Z {InstantSeconds=1624386423, MilliOfSecond=557, MicroOfSecond=557700, NanoOfSecond=557700000},ISO
Success: 2021-06-22T18:27:03.55770000Z {InstantSeconds=1624386423, MilliOfSecond=557, MicroOfSecond=557700, NanoOfSecond=557700000},ISO
但真正的问题是,“这个格式化程序的期望是什么”?似乎它是为了解析瞬间,但没有文档我们不确定。它是否真的意味着在即时支持的某些日期格式上失败,是否真的意味着期待文字“Z”而不是偏移量?如果它的目的是能够准确地解析这些瞬间,那么将其更改为实际准确是您应该做的。
但是,如果它的限制性更强并且在奇怪的情况下失败,那么使用 aksappy 的想法可能是要走的路,因为他的格式与您现有的格式保持接近,但允许您显式添加到模式以匹配您想要匹配的新格式.
我希望您在小数点后六位数的成功是您java.time
或提供此 API 的任何库中的错误。
使用 OpenJDK 16.0.1 运行:
public static void main(String[] args) {
DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSSSSS'Z'");
String[] dates = {
"2021-06-22T18:27:03.5577Z",
"2021-06-22T18:27:03.55770Z",
"2021-06-22T18:27:03.557700Z",
"2021-06-22T18:27:03.5577000Z",
"2021-06-22T18:27:03.55770000Z",
};
for (String date : dates) {
try {
System.out.println("Success: " + date + "\t\t" + TIME_FORMATTER.parse(date));
} catch (Exception e) {
System.out.println("Failure: " + date);
}
}
}
根据您的格式,我得到以下符合我期望的结果:
Failure: 2021-06-22T18:27:03.5577Z Text '2021-06-22T18:27:03.5577Z' could not be parsed at index 20
Failure: 2021-06-22T18:27:03.55770Z Text '2021-06-22T18:27:03.55770Z' could not be parsed at index 20
Failure: 2021-06-22T18:27:03.557700Z Text '2021-06-22T18:27:03.557700Z' could not be parsed at index 20
Success: 2021-06-22T18:27:03.5577000Z {},ISO resolved to 2021-06-22T18:27:03.557700
Failure: 2021-06-22T18:27:03.55770000Z Text '2021-06-22T18:27:03.55770000Z' could not be parsed at index 27