JSR-310 – 解析具有可变长度的秒分数

有没有办法如何创建JSR-310格式化程序,能够解析具有可变长度秒分数的以下日期/时间?

2015-05-07 13:20:22.276052 

要么

 2015-05-07 13:20:22.276 

示例代码:

 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); 

这解决了这个问题:

 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 

JiriS的答案是不正确的,因为它使用appendValue而正确的方法是使用DateTimeFormatterBuilder.appendFraction (它也处理小数点)。 可以在第二个系统中看到差异,其中appendValue错误地解析“2015-05-07T13:20:22.000276”。

在解析时, LocalDateTime.parse(str, formatter)比在大多数情况下直接使用格式化程序更简洁。

使用构建器时 ,请利用appendPattern()optionalStart()来保持整洁。

这一个有效

 DateTimeFormatter formatter = new java.time.format.DateTimeFormatterBuilder() .append( java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss") ) .appendOptional( new java.time.format.DateTimeFormatterBuilder() .appendLiteral('.') .appendValue( ChronoField.MICRO_OF_SECOND, 1, 6, SignStyle.NOT_NEGATIVE).toFormatter()) .toFormatter();