首页 > 解决方案 > Java 8 DateTimeFormatterBuilder appendValue zeroPadding 未按预期工作

问题描述

我正在尝试将毫秒数格式化为 3 位,从 offsetDate Time 序列化为 ISOString

价值 预期的 实际的
2020-06-16T05:47:40.1-06:00 2020-06-16T11:47:40.001Z 2020-06-16T11:47:40.100Z
2020-06-16T05:47:40.12-06:00 020-06-16T11:47:40.012Z 020-06-16T11:47:40.120Z

当我使用

private static final DateTimeFormatter outFormatter = new DateTimeFormatterBuilder()
        .parseLenient()
        .append(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss"))
        .appendLiteral('.')
        .appendValue(ChronoField.MILLI_OF_SECOND,3)
        .appendZoneId()
        .toFormatter()
        .withZone(ZoneId.from(ZoneOffset.UTC));

文档说填充将在左侧。但我在右边得到填充。

关于如何使用日期格式化程序实现的任何建议?

标签: datejava-8dateformatter

解决方案


.1in2020-06-16T05:47:40.1-06:00表示秒的分数,.1秒,因此也可以写为.100秒。就毫秒而言,它将是.1 * 1000=100毫秒。

除此之外,您还可以使用 大大简化代码 OffsetDateTime#withOffsetSameInstant,如下所示:

import java.time.OffsetDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;

public class Main {
    public static void main(String[] args) {
        // Test
        System.out.println(parseOdtStrAndConvertWithOffsetSameInstant("2020-06-16T05:47:40.1-06:00"));
        System.out.println(parseOdtStrAndConvertWithOffsetSameInstant("2020-06-16T05:47:40.12-06:00"));
    }

    static String parseOdtStrAndConvertWithOffsetSameInstant(String text) {
        OffsetDateTime odt = OffsetDateTime.parse(text).withOffsetSameInstant(ZoneOffset.UTC);
        return odt.format(DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSX"));
    }
}

输出:

2020-06-16T11:47:40.100Z
2020-06-16T11:47:40.120Z

推荐阅读