这里有一个非常简单的问题,但需要一些逻辑专业知识来解决这个问题。因此,我有一个 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,我需要确定给定的时间范围是否介于或等于任何占用的插槽之间以避免重叠。任何想法,最好的方法是什么?我希望有一个非常简单紧凑的解决方案,它始终适用于这种情况。对所有建议持开放态度,值得一试!如果需要进一步澄清,很乐意分享更多详细信息 提前感谢!
假设您有一个时间(hour
,minute
),一个范围开始时间(startHour
,startMinute
)和一个范围结束时间(endHour
,endMinute
)。
要检查时间是否在范围内,下限(含),上限(含),检查时间是否在范围之内会更容易:
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
}