JSR-310 - parsing seconds fraction with variable length

前端 未结 2 1731
攒了一身酷
攒了一身酷 2020-11-30 07:26

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.         


        
相关标签:
2条回答
  • 2020-11-30 08:01

    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.

    0 讨论(0)
  • 2020-11-30 08:04

    And this one works

    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();
    
    0 讨论(0)
提交回复
热议问题