Python 2.7中基于ISO周历计算员工下一个可用工作时段
解决方案:无需转换为datetime列表,直接计算下一个可用工作时间
不用非得把工作日转换成datetime.datetime列表来解决这个问题,我们可以通过星期循环计算和日期偏移的方式高效得到结果,避免生成不必要的日期序列。
核心思路
我们需要分两步判断:
- 检查查询日期当天是否还在工作时段内,如果是,当前时间就是可用时间(可根据需求调整为返回当天剩余工作时段的起点);如果不是,就找下一个工作日。
- 处理星期循环的情况:比如周五之后是周一,周日之后是周一,直接通过ISO星期数的循环逻辑找到下一个属于
working_days的星期几,再计算对应的日期。
具体代码实现(Python 2.7)
import datetime working_days = { 1: {'start': datetime.time(8, 0), 'end': datetime.time(17, 15)}, 2: {'start': datetime.time(7, 45), 'end': datetime.time(17, 0)}, 3: {'start': datetime.time(8, 0), 'end': datetime.time(16, 45)}, 4: {'start': datetime.time(10, 0), 'end': datetime.time(15, 30)}, 5: {'start': datetime.time(8, 30), 'end': datetime.time(17, 15)} } searched_date = datetime.datetime(2018, 6, 13, 20, 57, 00) # Wednesday searched_weekday = searched_date.isoweekday() def get_next_available_time(searched_dt, work_days): # 先检查当天是否是工作日,且当前时间在工作时段内 if searched_weekday in work_days: work_start = datetime.datetime.combine(searched_dt.date(), work_days[searched_weekday]['start']) work_end = datetime.datetime.combine(searched_dt.date(), work_days[searched_weekday]['end']) if work_start <= searched_dt <= work_end: return searched_dt # 如果当前在工作时间内,返回当前时间 # 找下一个工作日的星期数:循环遍历后续的星期,直到找到在work_days里的 next_weekday = None # 生成从下一天开始的星期序列(处理1-7的循环) for i in range(1, 8): candidate_weekday = (searched_weekday + i) % 7 # ISO星期中7代表周日,%7后0对应周日,需转换为7 if candidate_weekday == 0: candidate_weekday = 7 if candidate_weekday in work_days: next_weekday = candidate_weekday break # 计算下一个工作日的日期偏移量 days_to_add = (next_weekday - searched_weekday) % 7 next_work_date = searched_dt.date() + datetime.timedelta(days=days_to_add) # 组合日期和对应工作日的开始时间 next_available_dt = datetime.datetime.combine(next_work_date, work_days[next_weekday]['start']) return next_available_dt # 测试执行 result = get_next_available_time(searched_date, working_days) print(result) # 输出: 2018-06-14 10:00:00
代码解释
- 当日工作时段检查:先判断查询日期是否属于工作日,且当前时间在当日工作时段内,如果满足则直接返回当前时间(可根据业务需求调整为返回当日工作时段的起点)。
- 循环查找下一个工作日:通过遍历后续7天的星期数(利用模运算处理跨周循环),快速定位第一个属于
working_days的星期几。 - 日期偏移计算:用
(next_weekday - searched_weekday) %7自动计算需要添加的天数,完美处理跨周末的情况(比如周五到周一自动计算为3天)。 - 时间组合:通过
datetime.combine将找到的工作日日期与对应时段的开始时间合并,得到最终的可用时间戳。
这种方法无需生成大量日期列表,计算效率更高,尤其在查询日期跨度较大时优势明显。
内容的提问来源于stack exchange,提问作者Sebastien D
相关产品推荐
相关产品推荐

