You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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')

关键说明

  1. 手动处理星期缩写:通过自定义weekday_map,调用lower()统一转换输入格式,不管输入是小写还是大写都能正确映射到星期数字,彻底避开系统区域设置的不确定性。
  2. 时间转换为分钟数:把HH:MM转换成当天的总分钟数(比如02:00=120分钟),时间比较变成简单的整数比较,直观又可靠。
  3. 分情况处理跨周窗口:当维护窗口跨周(比如周五到周一)时,单独处理逻辑——只要当前时间处于起始星期到周末,或者周一到结束星期的区间内,再匹配时间条件即可。
  4. 脱离完整datetime比较:只使用星期数和当天分钟数两个维度,完全避开了年月日的干扰,精准匹配你“仅关注星期和时间”的需求。

内容的提问来源于stack exchange,提问作者Kev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:34:54