如何高效判断LocalDateTime是否处于工作日工作时段?
最优的日期范围判断方案分析
针对你要判断「周一至周五8:00-18:00」的需求,我们逐一分析几种写法的优劣:
几种候选写法的对比
1. 原始排除式写法
day != 6 && day != 7 && hour > 7 && hour < 18
逻辑直白但可读性差:读者需要自行对应6=周六、7=周日,小时部分的>7 <18也需要反应过来实际是8到17点,维护时容易看错边界条件。
2. 混合区间写法
day != 6 && day != 7 && hour in 8..17
小时部分用Kotlin区间语法in 8..17,比原始比较更直观,但工作日判断仍用排除法,还是需要关联数字和星期几,可读性提升有限。
3. 全区间写法
day in 1..5 && hour in 8..17
完全符合Kotlin的惯用写法,可读性拉满:一眼就能看懂是「周一到周五(因为DayOfWeek.value中1=周一、5=周五)+ 8到17点」,无需额外思考数字对应的含义,维护成本低。
4. 更优雅的枚举区间写法(推荐)
还可以直接用DayOfWeek枚举值而非数值,写法更类型安全、可读性更强:
val current = LocalDateTime.now() if (current.dayOfWeek in DayOfWeek.MONDAY..DayOfWeek.FRIDAY && current.hour in 8..17) { // 触发通知逻辑 }
这种写法完全不用依赖value的数字映射,即使后续API有变动(概率极低)也不会出问题,同时语义最清晰,别人看代码瞬间就能理解判断规则。
性能与最优选择
这几种写法的性能几乎没有差异,因为都是简单的数值/枚举比较,编译器会优化成等价的字节码。
优先级排序:
- 枚举区间写法(最推荐,语义清晰、类型安全)
- 全区间写法
day in 1..5 && hour in 8..17(简洁符合Kotlin风格) - 混合区间写法
- 原始排除式写法(不推荐,可读性差)
内容的提问来源于stack exchange,提问作者Joe Mama Jr.
相关产品推荐
相关产品推荐

