Java 8 LocalDateTime - 如何获取两个日期之间的所有时间
Posted
技术标签:
【中文标题】Java 8 LocalDateTime - 如何获取两个日期之间的所有时间【英文标题】:Java 8 LocalDateTime - How to Get All Times Between Two Dates 【发布时间】: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
类而不是自己创建类。
【参考方案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 更改为 plusMinutes 和 DAYS 分钟。
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<LocalDateTime> stream() return Stream.iterate(startDate, d -> 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);
【讨论】:
以上是关于Java 8 LocalDateTime - 如何获取两个日期之间的所有时间的主要内容,如果未能解决你的问题,请参考以下文章
Hibernate 5.1 和 Java 8 LocalDateTime
Java 8:多个单位中两个 LocalDateTime 之间的差异
Spring MVC 和 LocalDateTime java 8
关于java1.8中LocalDateTime实现日期,字符串互转小坑。
Apache Olingo OData 2.0 不支持 Java 8 LocalDatetime (java.time)