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

2022-09-01 05:58:04

有没有办法创建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);

答案 1

这解决了以下问题:

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

在解析时,LocalDateTime.parse(str,formatter)是一种比在大多数情况下直接使用格式化程序更整洁的方法。

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


答案 2

这个有效

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

推荐