【问题标题】:Java 8 LocalDateTime - How to Get All Times Between Two DatesJava 8 LocalDateTime - 如何获取两个日期之间的所有时间
【发布时间】:2018-07-10 21:56:45
【问题描述】:

我想以 2018-01-31T17:20:30Z (或 "yyyy-MM-dd'T'HH:mm:ss'Z'" )格式以 60 秒为增量生成两个日期之间的日期 + 时间列表。

到目前为止,我已经能够使用 LocalDate 对象生成两个日期之间的所有日期:

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);
  }

}

给定一个开始和结束日期,这将生成一个包含其间所有日期的Iterable

但是,我想修改它,使其每次使用 LocalDateTime 对象以 60 秒的增量生成(即,不是每天生成一个值,而是生成 1440 个值,因为每小时 60 分钟乘以 24 小时每天假设开始和结束时间只有一天)

谢谢

【问题讨论】:

  • 提示:将 ThreeTen-Extra 库添加到您的项目中,以使用 LocalDateRange 类而不是自己创建类。

标签: java date java-stream iterable localdate


【解决方案1】:

我不确定问题出在哪里,所以也许我误解了这个问题,但我会选择以下内容:

编辑:请参阅@isaac 答案

public Stream<LocalDateTime> stream() {
    return Stream.iterate(startDate.atStartOfDay(), d -> d.plus(60, ChronoUnit.SECONDS))
        .limit(ChronoUnit.DAYS.between(startDate, endDate) + 1);
}

【讨论】:

  • DAYS 应转换为 MINUTES
  • 啊,是的,你是对的,无论如何@isaac 的答案似乎是正确的
【解决方案2】:

只需将 LocalDate 更改为 LocalDateTime 并将 plusDays 更改为 plusMinutesDAYS 分钟

    public class DateTimeRange implements Iterable<LocalDateTime> {


      private final LocalDateTime startDateTime;
      private final LocalDateTime endDateTime;

      public DateTimeRange(LocalDateTime startDateTime, LocalDateTime endDateTime) {
        //check that range is valid (null, start < end)
        this.startDateTime = startDateTime;
        this.endDateTime = endDateTime;
      }


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

      public Stream<LocalDateTime> stream() {
         return Stream.iterate(startDateTime, d -> d.plusMinutes(1))
                     .limit(ChronoUnit.MINUTES.between(startDateTime, endDateTime) + 1);
      }
   }

【讨论】:

  • 谢谢。如果我修改代码以每 5 小时生成一次时间戳,这会导致问题 @: public Stream&lt;LocalDateTime&gt; stream() { return Stream.iterate(startDate, d -&gt; d.plusMinutes(300)) .limit( ChronoUnit.MINUTES.between(startDate, endDate ) + 1); } 例如,如果我通过 DateRange(LocalDateTime.of(2017, 1, 1, 0, 0), **LocalDateTime.now()**) 它会一直生成到 yr 2341 而不是今天的日期。将 ...MINUTES.between(startDate, endDate ) + 1); 更改为 ...MINUTES.between(startDate, endDate ) + 300); 未能解决问题。
【解决方案3】:

为什么,还是一样:

public Stream<LocalDateTime> stream() {
    return Stream.iterate(startDate, d -> d.plusMinutes(1))
                 .limit(ChronoUnit.MINUTES.between(startDate, endDate) + 1);
}

【讨论】:

    猜你喜欢
    • 2016-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-09
    • 1970-01-01
    • 1970-01-01
    • 2017-06-12
    • 1970-01-01
    相关资源
    最近更新 更多