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

Jir*_*riS 27 java java-time

有没有办法如何创建JSR-310格式化程序,能够用可变长度的秒分数解析以下日期/时间?

2015-05-07 13:20:22.276052
Run Code Online (Sandbox Code Playgroud)

要么

2015-05-07 13:20:22.276
Run Code Online (Sandbox Code Playgroud)

示例代码:

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);
Run Code Online (Sandbox Code Playgroud)

Jod*_*hen 45

这解决了这个问题:

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
Run Code Online (Sandbox Code Playgroud)

JiriS答案是错误的,因为它使用appendValue正确的方法是使用DateTimeFormatterBuilder.appendFraction(也处理小数点).可以在第二个系统中看到差异,其中appendValue错误地解析"2015-05-07T13:20:22.000276".

在解析时,LocalDateTime.parse(str, formatter)比大多数情况下直接使用格式化程序更简洁.

使用构建器时,请充分利用appendPattern()optionalStart()保持整洁.

  • 有没有办法用**仅**模式字符串创建这样的格式化程序? (3认同)
  • 不。模式是可能的格式化程序的子集。 (2认同)