Friday 6 December 2019

java - JSR-310 - parsing seconds fraction with variable length

Answer


Answer




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

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.


No comments:

Post a Comment

php - file_get_contents shows unexpected output while reading a file

I want to output an inline jpg image as a base64 encoded string, however when I do this : $contents = file_get_contents($filename); print &q...