Java 8 LocalDate - 如何获取两个日期之间的所有日期?

新手上路,请多包涵

是否可以在新的 java.time API 中获取 两个日期之间的所有日期

假设我有这部分代码:

 @Test
public void testGenerateChartCalendarData() {
    LocalDate startDate = LocalDate.now();

    LocalDate endDate = startDate.plusMonths(1);
    endDate = endDate.withDayOfMonth(endDate.lengthOfMonth());
}

现在我需要 startDateendDate 之间的所有日期。

我正在考虑获取两个日期的 daysBetween 并迭代:

 long daysBetween = ChronoUnit.DAYS.between(startDate, endDate);

for(int i = 0; i <= daysBetween; i++){
    startDate.plusDays(i); //...do the stuff with the new date...
}

有没有更好的方法来获取日期?

原文由 Patrick 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

假设您主要想迭代日期范围,那么创建一个可迭代的 DateRange 类是有意义的。这将允许你写:

 for (LocalDate d : DateRange.between(startDate, endDate)) ...

就像是:

 public class DateRange implements Iterable<LocalDate> {

  private final LocalDate startDate;
  private final LocalDate endDate;

  public DateRange(LocalDate startDate, LocalDate endDate) {
    //check that range is valid (null, start < end)
    this.startDate = startDate;
    this.endDate = endDate;
  }

  @Override
  public Iterator<LocalDate> iterator() {
    return stream().iterator();
  }

  public Stream<LocalDate> stream() {
    return Stream.iterate(startDate, d -> d.plusDays(1))
                 .limit(ChronoUnit.DAYS.between(startDate, endDate) + 1);
  }

  public List<LocalDate> toList() { //could also be built from the stream() method
    List<LocalDate> dates = new ArrayList<> ();
    for (LocalDate d = startDate; !d.isAfter(endDate); d = d.plusDays(1)) {
      dates.add(d);
    }
    return dates;
  }
}

添加 equals 和 hashcode 方法,getter,可能有一个静态工厂+私有构造函数来匹配 Java 时间 API 等的编码风格是有意义的。

原文由 assylias 发布,翻译遵循 CC BY-SA 3.0 许可协议

首先,您可以使用 TemporalAdjuster 获取该月的最后一天。接下来 Stream API 提供 Stream::iterate 这是解决您的问题的正确工具。

 LocalDate start = LocalDate.now();
LocalDate end = LocalDate.now().plusMonths(1).with(TemporalAdjusters.lastDayOfMonth());
List<LocalDate> dates = Stream.iterate(start, date -> date.plusDays(1))
    .limit(ChronoUnit.DAYS.between(start, end))
    .collect(Collectors.toList());
System.out.println(dates.size());
System.out.println(dates);

原文由 Flown 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏