【问题标题】:Java 8 DateTimeFormatterBuilder appendValue zeroPadding Not working as expectedJava 8 DateTimeFormatterBuilder appendValue zeroPadding 未按预期工作
【发布时间】:2021-04-11 21:39:42
【问题描述】:

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

Value Expected Actual
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));

文档说填充将在左侧。但我得到了正确的填充。

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

【问题讨论】:

  • 为什么你期望 0.1 秒(100 毫秒)被表示为 0.001 秒(1 毫秒)?
  • 2020-06-16T05:47:40.1-06:00。有 40 秒后分数为 1。我们的一些代码使用 @JsonFormat("yyyy-MM-dd'T'HH:mm:ss:SSSXXX") 转换为 001ms 的杰克逊注解。我正在尝试统一多种格式以使用毫秒输出。那么哪一个是对的?我应该将其视为 40.1 秒而不是 40 秒 1 毫秒吗?
  • 来自stackoverflow.com/questions/30087963/… 。我理解它的分数,我应该改变我的期望。非常感谢。尽管 @jsonFormat 与 simpleDate 模式 SSS 认为 Java8 时间包 SSS 中的毫秒数是分数

标签: date java-8 dateformatter


【解决方案1】:

2020-06-16T05:47:40.1-06:00 中的.1 代表fraction-of-second 即.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

【讨论】:

  • 我相信 .toString() 不会在秒的分数恰好为 0 的极端情况下提供所需的字符串。然后将忽略毫秒。考虑一个由包含.SSS 的模式构建的DateTimeFormatter,用于三位小数。
  • 谢谢,@OleV.V。对于宝贵的建议。仅针对未来的访问者:即使第二个是 0(例如 2020-06-16T05:47-06:00)也可能发生这种情况,因为 java.time.Time#toString 的实施方式。我更新了代码以返回格式化的OffsetDateTime 字符串。
猜你喜欢
  • 2011-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-14
  • 2012-06-29
  • 1970-01-01
相关资源
最近更新 更多