如何仅用分钟(截断秒)格式化localdatetime?

iyzzxitl  于 2021-07-05  发布在  Java
关注(0)|答案(2)|浏览(1065)

我有 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 价值?

eh57zj3b

eh57zj3b1#

使用自定义格式化程序, 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));
pu82cl6c

pu82cl6c2#

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

这个 LocalDateTime#toString 默认情况下,如果“秒”和“纳米”字段为零,则忽略它们。
使用的格式将是最短的,输出的时间,其中省略部分暗示为零的完整值。 LocalDateTime#truncatedTo(ChronoUnit.MINUTES) 将“分之二”(second of minute)和“秒之纳米”(nano of second)字段设置为零。
截断返回原始日期时间的副本,其中字段小于指定的单位设置为零。例如,以分钟为单位进行截断会将“秒”和“纳米”字段设置为零。
因此,您的用例不需要格式化程序。
演示:

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

相关问题