DateTimeFormatterBuilder appendOptional多个ISO标准导致DateTimePars


public class Main {
public static void main(String[] args) {  
DateTimeFormatterBuilder dtf = new DateTimeFormatterBuilder()
.appendOptional(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
.appendOptional(DateTimeFormatter.ISO_OFFSET_DATE_TIME)
.appendOptional(DateTimeFormatter.ISO_LOCAL_DATE);

LocalDateTime x = LocalDateTime.parse("2021-10-11T07:00:53.004Z", dtf.toFormatter());
System.out.println("After formatting: " + x);  
}  
}  

所以我很好奇为什么这不起作用,似乎他自动假设第一个不是可选的?如果我交换offset_date_time和local_date_time它会解析这个字符串而不是local_date_time字符串

Exception in thread "main" java.time.format.DateTimeParseException: Text '2021-10-11T07:00:53.004Z' could not be parsed, unparsed text found at index 23
at java.base/java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:2053)
at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1952)
at java.base/java.time.LocalDateTime.parse(LocalDateTime.java:493)
at Main.main(Main.java:12)

我在Java 14上,如果有什么不同的话,我很乐意提供额外的信息,如果需要的话

最后我也改变了方法,以允许所有3个ISO标准:

public class Main {
public static void main(String[] args) {  
DateTimeFormatterBuilder dtf = new DateTimeFormatterBuilder()
.append(DateTimeFormatter.ISO_LOCAL_DATE)
.appendOptional(DateTimeFormatter.ofPattern("'T'"))
.appendOptional(DateTimeFormatter.ISO_LOCAL_TIME)
.appendOptional(DateTimeFormatter.ofPattern("XXX"));

LocalDateTime x = LocalDateTime.parse("2021-10-11T07:00:53.004Z", dtf.toFormatter());
System.out.println("After formatting: " + x);  
}  
}  

,这是因为第一个可选部分可以完全消耗,因此DateTimeFormatter消耗ISO_LOCAL_DATE_TIME表示的文本。

然后,对剩余的文本Z尝试剩下的两个可选模式,但是它们不能匹配。

最后,没有模式可解析,因此解析器注意到文本Z未解析,因此抛出异常。

相关内容

  • 没有找到相关文章

最新更新