【问题标题】:How to format LocalDateTime with minutes only (truncate seconds)?如何仅用分钟格式化 LocalDateTime(截断秒)?
【发布时间】:2026-01-14 13:35:01
【问题描述】:

我有 LocalDateTime 值并希望使用 ISO_LOCAL_DATE_TIME 常量仅打印到 分钟

两个测试用例都失败了:

Expected :2020-10-10T15:16
Actual   :2020-10-10T15:16:00

但是为什么呢?

assertEquals("2020-10-10T15:16", LocalDateTime.parse("2020-10-10T15:16:17")
                .truncatedTo(ChronoUnit.MINUTES)
                .format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));

assertEquals("2020-10-10T15:16", DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(
        LocalDateTime.parse("2020-10-10T15:16:17").truncatedTo(ChronoUnit.MINUTES)));

除此之外:使用第一种或第二种方法格式化LocalDateTime 值的区别在哪里?

【问题讨论】:

标签: java java-time localdate localdatetime


【解决方案1】:

您的用例不需要格式化程序

LocalDateTime#toString 默认情况下会省略秒和纳秒字段(如果它们为零)。

使用的格式将是输出完整值的最短格式 省略部分被暗示为零的时间。

LocalDateTime#truncatedTo(ChronoUnit.MINUTES) 将秒和纳秒字段设置为零。

截断返回带有字段的原始日期时间的副本 小于设置为零的指定单位。例如,截断 使用分钟单位将设置秒和纳秒 字段为零。

因此,您的用例不需要格式化程序。

演示:

import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;

public class Main {
    public static void main(String[] args) {
        System.out.println(LocalDateTime.parse("2020-10-10T15:16:17").truncatedTo(ChronoUnit.MINUTES));
    }
}

输出:

2020-10-10T15:16

【讨论】:

    【解决方案2】:

    使用自定义格式化程序,ISO_LOCAL_DATE_TIME 将始终使用00 表示当日期时间截断为分钟时的秒数,因为该日期格式指定应包含秒数(并且 0 是秒字段的值在日期时间)。

    这应该可以工作

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm");
    assertEquals("2020-10-10T15:16", LocalDateTime.parse("2020-10-10T15:16:17")
             //.truncatedTo(ChronoUnit.MINUTES) <-- not needed with that format
               .format(formatter));
    

    【讨论】:

      最近更新 更多