给定DateTime的格式化范围,每隔小时拆分并打印此范围

时间:2018-05-08 09:08:14

标签: java datetime while-loop

算法的目标是将一段时间分成不同的日期。

我有一个变量: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循环可能不是最好的,我不知道为什么。

1 个答案:

答案 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表示偏移零)。否则它会有点复杂。

其他注意事项:

  • 使用命名约定(至少在Stack Overflow和其他地方共享代码时)。变量名以小写字母开头,不包含下划线。
  • 要保留Z,请使用OffsetDateTime,而不是LocalDateTime。由于您的开始和结束时间字符串采用ISO 8601的标准格式,因此您的案例中不需要DateTimeFormatter