我需要从范围中创建日期。
示例:
Start: 01.01.2017 16:30
End: 04.01.2017 23.30
预期结果:
01.01.2017 16:30
01.01.2017 23:00
01.02.2017 09:00
01.02.2017 23:00
01.03.2017 09:00
01.03.2017 23:00
01.04.2017 09:00
01.04.2017 23:00
01.04.2017 23.30
etc...
还有更好的方法吗?
ZonedDateTime start = ZonedDateTime.now();
ZonedDateTime end = ZonedDateTime.now().plusDays(10);
List<ZonedDateTime> result = new ArrayList();
result.add(start);
while(start.isBefore(end) || start.compareTo(end)==0){
if(start.getHour == 23 || start.getMinute() == 0){
result.add(start);
}
if(start.getHour == 9 || start.getMinute() == 0){
result.add(start);
}
start = start.addMinutes(1);
}
result.add(end);
答案 0 :(得分:1)
因此,您说要迭代两个日期之间的时间,并且基于预期的输出,您每天只需要两个特定的时间,这引起了您为何要增加分钟数的疑问。
也许(从概念上)更像...
String startValue = "01.01.2017 16:30";
String endValue = "04.01.2017 23:30";
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.appendPattern("dd.MM.yyyy HH:mm")
.toFormatter(Locale.UK);
LocalDateTime startDate = LocalDateTime.parse(startValue, formatter);
LocalDateTime endTime = LocalDateTime.parse(endValue, formatter);
List<LocalDateTime> times = new ArrayList<>(10);
for (LocalDateTime time = startDate; time.isBefore(endTime); time = time.plusDays(1)) {
times.add(time.withHour(16).withMinute(30));
times.add(time.withHour(23).withMinute(00));
}
for (LocalDateTime zdt : times) {
System.out.println(formatter.format(zdt));
}
将帮助解决该问题。
这将输出...
01.01.2017 16:30
01.01.2017 23:00
02.01.2017 16:30
02.01.2017 23:00
03.01.2017 16:30
03.01.2017 23:00
04.01.2017 16:30
04.01.2017 23:00
其他解决方案可能是有两个锚定时间,一个锚定时间16:30
和一个锚定时间23:00
,并在每个循环中将它们简单地增加一天
答案 1 :(得分:-1)
您可以使用“持续时间”来实现。该类提供对LocalTime,ZonedDateTime或LocalDateTime对象的操作。
示例:
Duration daily = Duration.ofDays(1);
Duration hourly = Duration.ofHours(1);
使用一些小算法和此类,您应该完成自己的目标。
算法示例,根据需要进行修改:开始定义您是在9:00之前还是23:00之前,在最接近的位置创建您的第一个ZonedDateTime,创建从9:00到23的持续时间,然后是第二个到23:00到9:00,然后进行迭代直到您达到结束日期,并在每次迭代时创建ZonedDateTime对象。