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