Python解析维护窗口时间并判断是否处于窗口内的问题
解决维护窗口时间判断的问题
你的代码遇到两个核心问题:一是datetime.strptime生成的对象包含年月日,导致和当前时间的跨星期比较完全失效;二是%a格式符对小写星期缩写的支持依赖系统区域设置,大概率无法直接识别sat/sun这类小写缩写。下面是针对性的解决方案:
核心思路
我们不需要完整的datetime对象,只需要提取星期几和**当天时间(转换为分钟数)**这两个维度来做判断,同时手动处理星期缩写的映射,避免依赖系统locale。
完整修复代码
from datetime import datetime def parse_maintenance_window(window_str): # 手动映射小写星期缩写到ISO星期数(1=周一,7=周日) weekday_map = { 'mon': 1, 'tue': 2, 'wed': 3, 'thu': 4, 'fri': 5, 'sat': 6, 'sun': 7 } start_str, end_str = window_str.split('-') # 解析开始时间 start_weekday, start_hh, start_mm = start_str.split(':') start_weekday_num = weekday_map[start_weekday.lower()] start_total_min = int(start_hh) * 60 + int(start_mm) # 解析结束时间 end_weekday, end_hh, end_mm = end_str.split(':') end_weekday_num = weekday_map[end_weekday.lower()] end_total_min = int(end_hh) * 60 + int(end_mm) return (start_weekday_num, start_total_min), (end_weekday_num, end_total_min) def is_in_maintenance(window_str): (start_wd, start_min), (end_wd, end_min) = parse_maintenance_window(window_str) now = datetime.now() current_wd = now.isoweekday() # 获取当前ISO星期数(1=周一,7=周日) current_min = now.hour * 60 + now.minute # 分两种情况处理:窗口不跨周,窗口跨周(比如fri到mon) if start_wd <= end_wd: # 情况1:窗口在同一周内(如mon-fri) if (start_wd < current_wd < end_wd): return True elif current_wd == start_wd and current_min >= start_min: return True elif current_wd == end_wd and current_min <= end_min: return True else: return False else: # 情况2:窗口跨周(如fri:22:00-mon:06:00) if current_wd >= start_wd or current_wd <= end_wd: if current_wd == start_wd and current_min >= start_min: return True elif current_wd == end_wd and current_min <= end_min: return True elif (start_wd < current_wd <=7) or (1 <= current_wd < end_wd): return True else: return False # 测试代码 maintenance = "sat:02:00-sun:03:00" if is_in_maintenance(maintenance): print('In maintenance window') else: print('Not in maintenance window')
关键说明
- 手动处理星期缩写:通过自定义
weekday_map,调用lower()统一转换输入格式,不管输入是小写还是大写都能正确映射到星期数字,彻底避开系统区域设置的不确定性。 - 时间转换为分钟数:把
HH:MM转换成当天的总分钟数(比如02:00=120分钟),时间比较变成简单的整数比较,直观又可靠。 - 分情况处理跨周窗口:当维护窗口跨周(比如周五到周一)时,单独处理逻辑——只要当前时间处于起始星期到周末,或者周一到结束星期的区间内,再匹配时间条件即可。
- 脱离完整datetime比较:只使用星期数和当天分钟数两个维度,完全避开了年月日的干扰,精准匹配你“仅关注星期和时间”的需求。
内容的提问来源于stack exchange,提问作者Kev
相关产品推荐
相关产品推荐

