-1

我有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

4

2 回答 2

3

使用自定义格式化程序,当日期时间被截断为分钟时,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));
于 2020-12-03T11:07:11.660 回答
3

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

默认情况下,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
于 2020-12-05T02:06:04.800 回答