Contents

Java 获取两个日期之间的所有日期

1. 概述

Java 8 中引入的新时间 API 使处理日期和时间成为可能,而无需使用外部库。

在这个简短的教程中,我们将了解如何在不同版本的 Java 中随着时间的推移获取两个日期之间的所有日期变得更加容易。

2. 使用 Java 7

在 Java 7 中,一种计算方法是使用Calendar实例。

首先,我们将获得没有 time 的开始日期和结束日期 。然后,我们将遍历这些并使用add方法和Calendar.Date字段在每次迭代中添加一天,直到它到达结束日期。 这是演示它的代码 - 使用Calendar实例:

public static List getDatesBetweenUsingJava7(Date startDate, Date endDate) {
  List datesInRange = new ArrayList<>();
  Calendar calendar = getCalendarWithoutTime(startDate);
  Calendar endCalendar = getCalendarWithoutTime(endDate);
  while (calendar.before(endCalendar)) {
    Date result = calendar.getTime();
    datesInRange.add(result);
    calendar.add(Calendar.DATE, 1);
  }
  return datesInRange;
}
private static Calendar getCalendarWithoutTime(Date date) {
  Calendar calendar = new GregorianCalendar();
  calendar.setTime(date);
  calendar.set(Calendar.HOUR, 0);
  calendar.set(Calendar.HOUR_OF_DAY, 0);
  calendar.set(Calendar.MINUTE, 0);
  calendar.set(Calendar.SECOND, 0);
  calendar.set(Calendar.MILLISECOND, 0);
  return calendar;
}

3. 使用 Java 8

在 Java 8 中,我们现在可以创建一个连续无限的日期Stream,并且只获取相关部分。不幸的是,当谓词匹配时,没有办法终止无限Stream——这就是为什么我们需要计算这两天之间的天数,然后简单地*limit()*流:

public static List<LocalDate> getDatesBetweenUsingJava8(
  LocalDate startDate, LocalDate endDate) { 
 
    long numOfDaysBetween = ChronoUnit.DAYS.between(startDate, endDate); 
    return IntStream.iterate(0, i -> i + 1)
      .limit(numOfDaysBetween)
      .mapToObj(i -> startDate.plusDays(i))
      .collect(Collectors.toList()); 
}

请注意,首先,我们如何使用between函数获取两个日期之间的天数差——与ChronoUnit枚举的DAYS常量相关联。

然后我们创建一个整数Stream,表示自开始日期以来的天数。在下一步中,我们使用plusDays() API将整数转换为LocalDate对象。

最后,我们将所有内容收集到一个列表实例中。

4. 使用 Java 9

最后,Java 9 带来了专门的计算方法:

public static List<LocalDate> getDatesBetweenUsingJava9(
  LocalDate startDate, LocalDate endDate) {
 
    return startDate.datesUntil(endDate)
      .collect(Collectors.toList());
}

我们可以使用LocalDate类的专用datesUntil方法通过单个方法调用来获取两个日期之间的日期。datesUntill返回从调用其方法的日期对象到作为方法参数给出的日期的顺序排序的日期Stream