我输入的字符串几乎是标准的ISO 8601,但是省略了小时部分(不要问为什么,时髦的数据从我的控件中输出)。
2018-01-23T12
如何在将小时数默认为零的情况下解析它?
2018-01-23T12:00
DateTimeFormatter.ISO_LOCAL_DATE_TIME
LocalDateTime
的默认解析器是DateTimeFormatter.ISO_LOCAL_DATE_TIME
。此格式化程序可以容忍可选的秒级分钟。小数秒和秒分钟都设置为零。
LocalDateTime ldt = LocalDateTime.parse( "2018-01-23T12:00" ) ; // Works.
但是省略了小时的失败,抛出异常。
LocalDateTime ldt = LocalDateTime.parse( "2018-01-23T12" ) ; // Fails.
DateTimeFormatterBuilder
我知道DateTimeFormatterBuilder
类及其在设置默认值时容忍可选部分的能力。
但我能够正确使用它。我设置了模式"uuuu-MM-dd HH"
,同时将分钟和分钟设置为默认值为零。
String input = "2018-01-23T12";
DateTimeFormatterBuilder b = new DateTimeFormatterBuilder().parseDefaulting( ChronoField.MINUTE_OF_HOUR , 0 ).parseDefaulting( ChronoField.SECOND_OF_MINUTE , 0 ).appendPattern( "uuuu-MM-dd HH" );
DateTimeFormatter f = b.toFormatter( Locale.US );
LocalDateTime ldt = LocalDateTime.parse( input , f );
System.out.println( ldt );
抛出异常:
线程“main”中的异常java.time.format.DateTimeParseException:无法在索引10处解析文本“2018-01-23T12”
at java.base / java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1988)
at java.base / java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1890)<< p>
at java.base / java.time.LocalDateTime.parse(LocalDateTime.java:492)
at com.basilbourque.example.App.doIt(App.java:31)
at com.basilbourque.example.App.main(App.java:22)
答案 0 :(得分:1)
如果仔细查看错误消息,您会看到它显示:Text '2018-01-23T12' could not be parsed at index 10
这意味着问题是格式为T.
如果我们返回DateTimeFormatterBuilder
,则指定的模式为:"uuuu-MM-dd HH"
。这是问题所在,它指定了一个实际存在T的空间。解决方案是将此模式替换为:"uuuu-MM-dd'T'HH"
String input = "2018-01-23T12";
DateTimeFormatterBuilder b = new DateTimeFormatterBuilder().parseDefaulting( ChronoField.MINUTE_OF_HOUR , 0 ).parseDefaulting( ChronoField.SECOND_OF_MINUTE , 0 ).appendPattern( "uuuu-MM-dd'T'HH" );
DateTimeFormatter f = b.toFormatter( Locale.US );
LocalDateTime ldt = LocalDateTime.parse( input , f );
System.out.println( ldt );
2018-01-23T12:00
确实,你根本不需要建造者。指定具有相同模式的DateTimeFormatter
。小时数默认为零。
String input = "2018-01-23T12";
DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-dd'T'HH" ) ;
LocalDateTime ldt = LocalDateTime.parse( input , f );
2018-01-23T12:00