【问题标题】:How to build a list of LocalDate from a given range? [duplicate]如何从给定范围构建 LocalDate 列表? [复制]
【发布时间】:2017-04-01 23:40:22
【问题描述】:

我有以下方法,其中我有startDateendDate 类型的字符串yyyy/mm/dd。我想返回一个List<LocalDate>

protected List<LocalDate> getDateList(String startDate, String endDate) {

//build list here

}

如何在 Java 8 中做到这一点?

【问题讨论】:

    标签: java list date java-8 java-stream


    【解决方案1】:

    假设您的输入数据是正确的,我们可以使用 Stream API 来生成给定范围内的所有日期:

    final LocalDate start = LocalDate.parse(startDate, DateTimeFormatter.ofPattern("yyyy/MM/dd"));
    final LocalDate end = LocalDate.parse(endDate, DateTimeFormatter.ofPattern("yyyy/MM/dd"));
    
    final int days = (int) start.until(end, ChronoUnit.DAYS);
    
    return Stream.iterate(start, d -> d.plusDays(1))
      .limit(days)
      .collect(Collectors.toList());
    

    示例:

    getDateList("2012/10/10", "2012/10/12")

    [2012-10-10, 2012-10-11]

    如果要包含结束日期,则需要使用.limit(days + 1)


    从 Java 9 开始,可以将其简化为:

    Stream.iterate(start, d -> d.isBefore(end), d -> d.plusDays(1))
      .collect(Collectors.toList());
    

    甚至:

    start.datesUntil(end, Period.ofDays(1));
    

    请记住确保正确处理包含最后日期的内容。

    【讨论】:

    【解决方案2】:

    accepted answer 是正确的,也是一个很好的。

    但是,有一个替代解决方案,我们在天数内创建一个LongStream。这里rangeClosed() 确保创建包括最后一天在内的多头流。如果最后一天不应包含在列表中,请替换为 range()

    与 pivovarit 提出的解决方案相比,这样做的好处是我们不需要将long 向下转换为int。此外,由于我们可以使用rangeClosed()range(),因此我们不需要days + 1 技巧来包含/排除最后日期:

    public List<LocalDate> toDateList(String startDate, String endDate) {
      final LocalDate start = LocalDate.parse(startDate, DateTimeFormatter.ofPattern("yyyy/MM/dd"));
      final LocalDate end = LocalDate.parse(endDate, DateTimeFormatter.ofPattern("yyyy/MM/dd"));
    
      final long days = start.until(end, ChronoUnit.DAYS);
    
      return LongStream.rangeClosed(0, days)
          .mapToObj(start::plusDays)
          .collect(Collectors.toList());
    }
    

    【讨论】:

      猜你喜欢
      • 2018-12-08
      • 2010-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-30
      • 1970-01-01
      • 2011-04-03
      • 2017-10-22
      相关资源
      最近更新 更多