如何检查给定的小时和分钟(int)是否在给定时间范围集合中的任何范围内或相等?

4
有一个比较简单的问题需要解决,但需要一些逻辑专业知识来解决。我有一个API返回给定时间段的开始和结束时间,24小时整数格式(例如:开始时间为4点30分,结束时间为5点30分)。请注意,返回的时间段是以30分钟为增量的,因此给定小时将从1到24,给定分钟将为30或0。
现在我有一组范围,每个范围表示已占用的时间段,我需要确定API返回的任何给定时间是否与这些时间段重叠或落入其中(这些时间段的小时数可以从1到24,但分钟数可能不同,可以是0到59之间的任意值)。
我的逻辑如下:
for (int i = 0; i < ranges.size(); i++) {

    int rangeStartHour = ranges.get(i).getStartTime().getHour();
    int rangeEndHour = ranges.get(i).getEndTime().getHour();
    int rangeStartMinute = ranges.get(i).getStartTime().getMinute();
    int rangeEndMinute = ranges.get(i).getStartTime().getMinute();

    if ((rangeStartHour == 0 && rangeEndHour == 24
            && rangeStartMinute == 0 && rangeEndMinute == 0)) {
        isAvailable = false;
    } else {
        isAvailable = true;
    }
}

我需要在其中加入一个 if 判断语句,以便判断给定的时间范围是否处于占用时间段之间或重叠。有什么好的方法来解决这个问题吗?我希望能够得到一个简单而紧凑的解决方案,可以始终适用于这种情况。欢迎提出所有建议,值得一试!如果需要进一步澄清,我很乐意分享更多细节。 先行致谢!

1个回答

4
假设您有一个时间(hourminute),一个范围开始时间(startHourstartMinute)和一个范围结束时间(endHourendMinute)。

要检查时间是否在范围内(包括下限,不包括上限),如果您检查时间是否在范围外,则会更容易:

if (hour < startHour) {
    // outside
} else if (hour == startHour && minute < startMinute) {
    // outside
} else if (hour > endHour) {
    // outside
} else if (hour == endHour && minute >= endMinute) {
    // outside
} else {
    // inside
}

// combined
if (hour < startHour || hour > endHour ||
        (hour == startHour && minute < startMinute) ||
        (hour == endHour && minute >= endMinute)) {
    // outside
} else {
    // inside
}

// reversed
if (hour >= startHour && hour <= endHour &&
        (hour != startHour || minute >= startMinute) &&
        (hour != endHour || minute < endMinute)) {
    // inside
} else {
    // outside
}

然而,通过一些准备工作,将小时/分钟的值合并为单个minuteOfDay值要简单得多:

// Prep work
int minuteOfDay = hour * 60 + minute;
int startMinuteOfDay = startHour * 60 + startMinute;
int endMinuteOfDay = endHour * 60 + endMinute;

// Test
if (minuteOfDay >= startMinuteOfDay && minuteOfDay < endMinuteOfDay) {
    // inside
} else {
    // outside
}

如果你使用ThreeTen Android Backport库,效果会更好:

// Store values as LocalTime instead of hour/minute pairs
LocalTime time = LocalTime.of​(hour, minute);
LocalTime startTime = LocalTime.of​(startHour, startMinute);
LocalTime endTime = LocalTime.of​(endHour, endMinute);

// Test
if (minuteOfDay.compareTo​(startMinuteOfDay) >= 0 && minuteOfDay.compareTo​(endMinuteOfDay) < 0) {
    // inside
} else {
    // outside
}

看起来很不错!感谢您的回复。问题稍微有点变化,我该如何确定一个时间段(例如5:30到6:30)的开始时间和结束时间是否在一组时间段内、重叠或超出范围?比如已经占用的时间段是(1:00到3:00、4:23到5:38、8:44到14:50)。 - user11455292
我不确定那是否回答了我的问题,基本上我想要的是针对给定槽(由开始小时、分钟、结束小时和结束分钟组成)以int形式给出的任何一个槽,我想要检查该槽是否在给定的一组槽内,或者与某些槽重叠。你能否修改你在解决方案#2中提到的逻辑来实现这一点呢?这似乎是我在代码中处理它的最佳方式,也更适合我的用例。谢谢 :) - user11455292
这个答案展示了如何比较两个时间(小时/分钟对)。链接展示了如何检查两个范围是否重叠,这需要使用比较,而你刚学会了如何做到这一点。要“检查此时段是否落在给定的一组时段内或与某些时段重叠”,你需要迭代该集合并检查每个时段是否重叠。现在,所需要做的就是将三者结合起来:“比较”、“重叠检查”和“落在集合内检查”。 - Andreas
谢谢您的回答!我现在已经把它搞定了 :) - user11455292

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接