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

时间:2015-05-07 13:52:15

标签: java java-time

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

2 个答案:

答案 0 :(得分:39)

这解决了这个问题:

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

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

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

使用builder时,请利用appendPattern()optionalStart()来保持整洁。

答案 1 :(得分:0)

这个有用

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