【问题标题】:How do I check if a given hour and minute (int's) falls within or is equal to any range within a given set of ranges of times?如何检查给定的小时和分钟(int's)是否落在或等于给定时间范围内的任何范围内?
【发布时间】:2020-04-12 00:10:21
【问题描述】:

这里有一个非常简单的问题,但需要一些逻辑专业知识来解决这个问题。所以,我有一个返回开始和结束时间的 API,对于一个 24 小时 int 格式的给定时间段,这样:开始时间为 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 in between,我需要确定给定时间范围是否介于或等于任何占用的时间段以避免重叠。有什么想法最好的方法是什么?我希望有一个非常简单且紧凑的解决方案,始终适用于这种情况。接受所有建议,值得一试!如果需要进一步澄清这一点,很高兴分享更多细节 提前致谢!

【问题讨论】:

    标签: java android


    【解决方案1】:

    假设您有一个时间(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
    }
    

    但是,通过一些准备工作,将hour/minute 值组合成一个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)
    • 我不确定这是否能回答我的问题,基本上我正在寻找的是任何给定的插槽(包括开始小时和分钟以及结束小时和结束分钟)作为整数,我想要检查此插槽是否属于给定的一组插槽或与某些插槽重叠。有没有办法可以修改您在解决方案 #2 中提到的逻辑来实现这一点?这似乎是我可以在我的代码中处理它的最佳方式,并且对于我的用例来说更可行。谢谢你:)
    • 这个答案显示了如何比较两次(小时/分钟对)。该链接显示了如何检查两个范围是否重叠,它使用比较,您刚刚学会了如何做到这一点。要“检查此插槽是否属于给定的 set 插槽或与某些插槽重叠”,您迭代该组并检查每个插槽是否重叠。现在所有需要做的,就是结合三者:“比较”、“重叠检查”和“落入集合检查”。
    • 谢谢您的回答!我现在可以工作了:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-01
    • 2021-03-15
    • 1970-01-01
    • 2016-11-07
    相关资源
    最近更新 更多