算法的目标是将一段时间分成不同的日期。
我有一个变量:TimeInterval = 2018-05-03T04:00Z/2018-05-03T06:00Z
这是2个小时的范围。
String[] All_Time = TimeInterval.split("/");
DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm'Z'");
LocalDateTime datetimestart = LocalDateTime.parse(All_Time[0], dateFormat);
LocalDateTime datetimeend = LocalDateTime.parse(All_Time[1], dateFormat);
do {
id = datetimestart.toString();
System.out.println(id+"/"+datetimestart.plusHours(1).toString());
datetimestart = datetimestart.plusHours(1);
} while (datetimestart.plusHours(1).equals(datetimeend));
System.out.println("Time End: "+datetimeend);
打印:
2018-05-03T04:00/2018-05-03T05:00
2018-05-03T05:00/2018-05-03T06:00
Time End: 2018-05-03T06:00
这正是我想要的(尽管我注意到' Z'正在丢失......)。
但是,当时间范围是24小时(在这里我还必须检查23和25小时的那一天),循环中断并给出TimeInterval = 2018-05-03T04:00Z/2018-05-04T04:00Z
输出是:
2018-05-03T08:00/2018-05-03T09:00
Time End: 2018-05-04T04:00
我知道plusHours(1)
无法在当天添加+1时出现问题,从第31天(28,29,30天)开始可能会发生同样的情况。月)到下个月1日 - > ......同样的一年。
有解决方法吗?
更新:
for (int inc=0; inc<=24; inc++){
System.out.println("Hour: "+datetimestart.plusHours(inc));
}
打印:
Hour: 2018-05-03T08:00
Hour: 2018-05-03T09:00
Hour: 2018-05-03T10:00
Hour: 2018-05-03T11:00
Hour: 2018-05-03T12:00
Hour: 2018-05-03T13:00
Hour: 2018-05-03T14:00
Hour: 2018-05-03T15:00
Hour: 2018-05-03T16:00
Hour: 2018-05-03T17:00
Hour: 2018-05-03T18:00
Hour: 2018-05-03T19:00
Hour: 2018-05-03T20:00
Hour: 2018-05-03T21:00
Hour: 2018-05-03T22:00
Hour: 2018-05-03T23:00
Hour: 2018-05-04T00:00
Hour: 2018-05-04T01:00
Hour: 2018-05-04T02:00
Hour: 2018-05-04T03:00
Hour: 2018-05-04T04:00
Hour: 2018-05-04T05:00
Hour: 2018-05-04T06:00
Hour: 2018-05-04T07:00
Hour: 2018-05-04T08:00
对我来说,很有可能do-while循环可能不是最好的,我不知道为什么。
答案 0 :(得分:1)
String timeInterval = "2018-05-03T08:00Z/2018-05-04T04:00Z";
String[] allTime = timeInterval.split("/");
if (allTime.length != 2) {
throw new IllegalStateException("Wrong number of datetimes, should be 2");
}
OffsetDateTime dateTimeStart = OffsetDateTime.parse(allTime[0]);
OffsetDateTime dateTimeEnd = OffsetDateTime.parse(allTime[1]);
OffsetDateTime current = dateTimeStart;
while (current.isBefore(dateTimeEnd)) {
OffsetDateTime next = current.plusHours(1);
System.out.println("" + current + '/' + next);
current = next;
}
System.out.println("Time End: " + dateTimeEnd);
输出(缩写在中间):
2018-05-03T08:00Z/2018-05-03T09:00Z
2018-05-03T09:00Z/2018-05-03T10:00Z
2018-05-03T10:00Z/2018-05-03T11:00Z
…
2018-05-03T22:00Z/2018-05-03T23:00Z
2018-05-03T23:00Z/2018-05-04T00:00Z
2018-05-04T00:00Z/2018-05-04T01:00Z
2018-05-04T01:00Z/2018-05-04T02:00Z
2018-05-04T02:00Z/2018-05-04T03:00Z
2018-05-04T03:00Z/2018-05-04T04:00Z
Time End: 2018-05-04T04:00Z
您的while
条件错误。您使用了equals
,如果第二个小时的结束时间与您的结束时间一致,则确保您只进行了第二次循环。而且从来没有第三次。而是在我的代码中使用isBefore
。另一个选项是! datetimestart.isEqual(datetimeend)
(感叹号表示“不是”)。我假设间隔始终是整数小时,并且开始和结束是相同的UTC偏移(Z
表示偏移零)。否则它会有点复杂。
其他注意事项:
Z
,请使用OffsetDateTime
,而不是LocalDateTime
。由于您的开始和结束时间字符串采用ISO 8601的标准格式,因此您的案例中不需要DateTimeFormatter
。