首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java8 LocalDate -如何获取两个日期之间的所有日期?

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

Stack Overflow用户
提问于 2016-07-06 17:25:57
回答 8查看 59.7K关注 0票数 62

在新的java.time应用编程接口中获取两个日期之间的所有日期是否具有可用性?

假设我有这部分代码:

代码语言:javascript
复制
@Test
public void testGenerateChartCalendarData() {
    LocalDate startDate = LocalDate.now();

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

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

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

代码语言:javascript
复制
long daysBetween = ChronoUnit.DAYS.between(startDate, endDate);

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

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

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2016-07-06 19:25:31

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

代码语言:javascript
复制
for (LocalDate d : DateRange.between(startDate, endDate)) ...

类似于:

代码语言:javascript
复制
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 time API的编码风格,这将是有意义的。

票数 92
EN

Stack Overflow用户

发布于 2016-07-06 17:35:15

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

代码语言:javascript
复制
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);
票数 79
EN

Stack Overflow用户

发布于 2018-06-21 21:21:10

Java 9

在Java9中,使用LocalDate.datesUntil(LocalDate endExclusive)方法增强了LocalDate类,该方法将日期范围内的所有日期作为Stream<LocalDate>返回。

代码语言:javascript
复制
List<LocalDate> dates = startDate.datesUntil(endDate).collect(Collectors.toList());
票数 49
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38220543

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档