营业时间: 13:00 - 次日03:00 如我输入一个16:34 或 03:10 判断是否在这个区间?
如果判断的时间区间在 24 小时内,可以引入一个偏移量来处理。
比如这个区间是在 [13:00, 3:00)
,那么用 13
小时来作为偏移量(区间起的小时数),可以写个函数
// 是按前才后开区间来判断的
static boolean inRange(LocalTime current, LocalTime begin, LocalTime end) {
var offset = begin.getHour(); // 用开始时间来找偏移量
var b = begin.minusHours(offset); // 三个时间都减去偏移量
var e = end.minusHours(offset);
var v = current.minusHours(offset);
return !b.isAfter(v) && e.isAfter(v);
}
完整的测试代码
import java.time.LocalTime;
public class Problem {
public static void main(String[] args) {
var beginTime = LocalTime.of(13, 0);
var endTime = LocalTime.of(3, 0);
var v1 = LocalTime.of(16, 34);
var v2 = LocalTime.of(3, 10);
System.out.println("v1: " + inRange(v1, beginTime, endTime)); // true
System.out.println("v2: " + inRange(v2, beginTime, endTime)); // false
}
private static boolean inRange(LocalTime current, LocalTime begin, LocalTime end) {
var offset = begin.getHour();
var b = begin.minusHours(offset);
var e = end.minusHours(offset);
var v = current.minusHours(offset);
return !b.isAfter(v) && e.isAfter(v);
}
}
如果区间大于 24 小时,那就必须要引入“天”的概念了,可以找一个基础时间来算每个时间的偏移时间差(根据精度,一般可以以秒为单位)。
假设今天0点时间为0,一个小时是1000 * 60 * 60 = 3,600,000毫秒
那今日13点为 A = 3,600,000 *13
次日03:00为 C = 3,600,000 * 27;
所有你把16:34解析成精确到毫秒的时间B 只需要判断 A<=B<=C
这个时间区间映射到一天后其实是2个闭区间[0:00,3:00]
和 [13:00,24:00]
,这样不方便比较,其实再取一次反,表明不在营业时间的是(3:00,13:00)
所以对待判断时间aTime
的判断就可以是!(3:00<aTime<13:00)
15 回答11.8k 阅读✓ 已解决
7 回答2.5k 阅读
8 回答2.9k 阅读✓ 已解决
9 回答1.8k 阅读✓ 已解决
2 回答1.1k 阅读✓ 已解决
7 回答1.6k 阅读
3 回答1.6k 阅读✓ 已解决
单从同一天的24小时来判断的,肯定是
startTime < validateTime < endTime
但题主的需求是"13:00 - 次日03:00",也就不是同一天,是跨天的, 如果还是从24小时的判断来说:
endTime < startTime
所以此时的逻辑反而变成
validateTime < endTime || validateTime > startTime
用
LocalTime
写成代码应该就类似如下:如果考虑更加通用的方式,也就是
startTime
和endTime
也是变量,即不考虑是否到底是同一天相比还是跨天相比。那这个
Predicate<LocalTime>
就需要变为BiFunction<LocalTime, LocalTime, Predicate<LocalTime>>
biFunction
这里的写法比较捡懒同时可以让代码放在一起,你可以选择整一个工具方法放着都行,感觉这样差不多叭~( ̄(エ) ̄)