有没有办法如何创建JSR-310格式化程序,能够用可变长度的秒分数解析以下日期/时间?
2015-05-07 13:20:22.276052
Run Code Online (Sandbox Code Playgroud)
要么
2015-05-07 13:20:22.276
Run Code Online (Sandbox Code Playgroud)
示例代码:
DateTimeFormatter formatter
= new java.time.format.DateTimeFormatterBuilder()
.append( java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss") )
.appendOptional( java.time.format.DateTimeFormatter.ofPattern(".SSSSSS") )
.toFormatter();
formatter.parse("2015-05-07 13:20:22.276052", LocalDateTime::from);
Run Code Online (Sandbox Code Playgroud)
Jod*_*hen 45
这解决了这个问题:
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.appendPattern("yyyy-MM-dd HH:mm:ss")
.appendFraction(ChronoField.MICRO_OF_SECOND, 0, 6, true)
.toFormatter();
System.out.println(LocalDateTime.parse("2015-05-07 13:20:22.276052", formatter));
System.out.println(LocalDateTime.parse("2015-05-07 13:20:22.276", formatter));
System.out.println(LocalDateTime.parse("2015-05-07 13:20:22", formatter));
// output
2015-05-07T13:20:22.276052
2015-05-07T13:20:22.276
2015-05-07T13:20:22
Run Code Online (Sandbox Code Playgroud)
JiriS的答案是错误的,因为它使用appendValue正确的方法是使用DateTimeFormatterBuilder.appendFraction(也处理小数点).可以在第二个系统中看到差异,其中appendValue错误地解析"2015-05-07T13:20:22.000276".
在解析时,LocalDateTime.parse(str, formatter)比大多数情况下直接使用格式化程序更简洁.
使用构建器时,请充分利用appendPattern()并optionalStart()保持整洁.