Is there a way how to create JSR-310 formatter that is able to parse both following date/times with variable length of seconds fraction?
2015-05-07 13:20:22.276052
or
2015-05-07 13:20:22.276
Example code:
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);
Advertisement
Answer
This solves the problem:
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
The answer by JiriS is incorrect, as it uses appendValue
whereas the correct way is to use DateTimeFormatterBuilder.appendFraction
(which also handles the decimal point). The difference can be seen in the second system out, where appendValue
incorrectly parses “2015-05-07T13:20:22.000276”.
When parsing, LocalDateTime.parse(str, formatter)
is a neater approach than using the formatter directly in most cases.
When using the builder, take advantage of appendPattern()
and optionalStart()
to keep things neat.