【问题标题】:Java 8 DateTimeFormatter dropping millis when they're zero?Java 8 DateTimeFormatter 在为零时丢弃毫秒?
【发布时间】:2016-02-03 18:08:34
【问题描述】:

这看起来很奇怪。 Java 8 根据毫秒是否为零来格式化输出。你如何强制 Java 8 (1.8.0_20) 总是吐出毫秒,无论它们是否为零?

public static void main(String[] args) {
    TemporalAccessor zeroedMillis = DateTimeFormatter.ISO_OFFSET_DATE_TIME.parse("2015-07-14T20:50:00.000Z");
    TemporalAccessor hasMillis = DateTimeFormatter.ISO_OFFSET_DATE_TIME.parse("2015-07-14T20:50:00.333Z");
    System.out.println(DateTimeFormatter.ISO_OFFSET_DATE_TIME.format(zeroedMillis));
    System.out.println(DateTimeFormatter.ISO_OFFSET_DATE_TIME.format(hasMillis));
}

2015-07-14T20:50:00Z
2015-07-14T20:50:00.333Z

【问题讨论】:

    标签: java datetime console formatting datetimeformatter


    【解决方案1】:

    你不使用ISO_OFFSET_DATE_TIME,基本上:)

    如果您按照文档进行操作,您最终会看到 ISO_LOCAL_TIME 的文档,其中包含:

    这将返回一个不可变的格式化程序,该格式化程序能够格式化和解析 ISO-8601 扩展本地时间格式。格式包括:

    • 两位数表示一天中的小时。这预先用零填充以确保两位数。
    • 冒号
    • 两位数表示小时。这预先用零填充以确保两位数。
    • 如果秒数不可用,则格式完整。
    • 冒号
    • 两位数表示秒。这预先用零填充以确保两位数。
    • 如果纳秒为零或不可用,则格式完整。
    • 小数点
    • 1 到 9 位表示纳秒。将根据需要输出尽可能多的数字。

    如果您总是想要 3 位数字,我怀疑您想要 DateTimeFormatter.ofPatternyyyy-MM-dd'T'HH:mm:ss.SSSX 的模式。

    【讨论】:

    • 是的,不幸的是,该模式无法解析:“无法在索引 23 处解析”。搜索似乎表明存在与分数(毫)解析相关的某种错误。
    • @Chris:我喝完茶再看看 :)
    • @ChrisKessel:嗯……它对我有用……这很奇怪。
    • 我正在尝试这个,你的代码是什么样的? DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ").parse("2016-02-03T10:40:31.457Z");错误:无法在索引 23 处解析文本“2016-02-03T10:40:31.457Z”
    • @ChrisKessel:修复了它——它最后需要一个 X 而不是 Z。请参阅编辑后的答案。
    猜你喜欢
    • 2018-07-26
    • 2017-11-06
    • 2012-04-30
    • 2018-10-02
    • 2022-10-05
    • 2018-12-06
    • 2014-11-04
    • 1970-01-01
    • 2020-05-06
    相关资源
    最近更新 更多