Java 8 LocalDateTime和DateTimeFormatter

Java 8 LocalDateTime和DateTimeFormatter,java,java-8,Java,Java 8,下面是一段代码thorws exception..我在这里做错了什么吗 DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern( "ddMMuuuuHHmmssSSS" ); String currentTime=FORMATTER.format(LocalD

下面是一段代码thorws exception..我在这里做错了什么吗

DateTimeFormatter  FORMATTER    = DateTimeFormatter.ofPattern(
                                        "ddMMuuuuHHmmssSSS"
                                    );      
    String currentTime=FORMATTER.format(LocalDateTime.now());
    System.out.println(currentTime);
    LocalDateTime parsedTime=LocalDateTime.parse(currentTime,FORMATTER);


09042016161444380
Exception in thread "main" java.time.format.DateTimeParseException: Text '09042016161444380' could not be parsed at index 4
at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949)
at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851)
at java.time.LocalDateTime.parse(LocalDateTime.java:492)
如上所述,对于
uuu
,解析器不知道这一年将在哪里结束。这是因为解析器逐字解释了2个以上的
u
y

年份的JavaDoc开始

对于解析,如果模式字母的数量超过2,则不管数字的数量如何,都会按字面解释年份。因此,使用“MM/dd/yyyy”模式,“01/11/12”解析为公元12年1月11日


因此,如果将其从
ddmmuuuhhmmsss
更改为
ddmmuuhhmmssss
ddmmyyhhmmssss
,它应该可以正常工作,因为在本例中,解析器知道确切的停止位置。

我怀疑问题在于解析器不知道这一年将停止在哪里-可能是20161年,而不是2016年。如果在日期和时间部分之间添加一个
'T'
,则它可以工作。就我个人而言,我强烈建议您尽可能使用ISO-8601格式……谢谢Jon,但解析器应该读取表示该年份为4个字符的模式,因此应该在2016年停止。@Krishan不,不完全是这样。4或更多的意思是从字面上解释年份,因此它会将年份解析为
2016161444380
——这在未来相当遥远。