使用java.time类解析带有省略分钟的日期时间输入字符串

时间:2018-03-07 23:24:38

标签: parsing datetime format java-time

我输入的字符串几乎是标准的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)

1 个答案:

答案 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