Python 手动解析 Cron 并返回中文

要将 Cron 表达式手动解析并转换为中文说明,你可以按以下格式进行解析:

Cron 表达式格式(标准 5 位):

┌──────── 分钟(0 - 59)
│ ┌────── 小时(0 - 23)
│ │ ┌──── 日(1 - 31)
│ │ │ ┌── 月(1 - 12)
│ │ │ │ ┌─ 星期(0 - 7)(0 和 7 都是周日)
│ │ │ │ │
│ │ │ │ │
* * * * *
def parse_cron_to_chinese(cron_expr: str) -> str:
    fields = cron_expr.strip().split()
    if len(fields) != 5:
        return "无效的 Cron 表达式(应为 5 位)"

    minute, hour, day, month, week = fields
    mapping = ["日", "一", "二", "三", "四", "五", "六", "日"]

    is_fixed_minute = minute.isdigit()
    is_every_minute = minute == "*"
    is_fixed_hour = hour.isdigit()
    is_every_hour = hour == "*"
    is_weekday = week != "*" and week.isdigit()
    is_day = day != "*" and day.isdigit()
    is_month = month != "*" and month.isdigit()

    parts = []

    # 精确时间点
    if is_fixed_minute and is_fixed_hour:
        if is_weekday:
            parts.append(f"每周{mapping[int(week) % 7]} {int(hour):02}:{int(minute):02}")
        elif is_day:
            parts.append(f"每月{int(day)}日 {int(hour):02}:{int(minute):02}")
        else:
            parts.append(f"每天 {int(hour):02}:{int(minute):02}")

    # 每小时中的每分钟
    elif is_every_minute and is_fixed_hour:
        parts.append(f"每天 {int(hour):02}:00 ~ {int(hour):02}:59 每分钟")

    # 每分钟、每小时
    elif is_every_minute and is_every_hour:
        parts.append("每分钟")

    # 其他情况回退通用表达
    else:
        def field_to_chinese(field: str, unit: str) -> str:
            if field == "*":
                return ""
            elif field.startswith("*/"):
                return f"每{field[2:]}{unit}"
            elif "-" in field:
                start, end = field.split("-")
                return f"从第{start}到第{end}{unit}"
            elif "," in field:
                values = "、".join(field.split(","))
                return f"在第{values}{unit}"
            else:
                return f"在第{field}{unit}"

        def weekday_to_chinese(field: str) -> str:
            if field == "*":
                return ""
            elif "," in field:
                days = [mapping[int(d) % 7] for d in field.split(",")]
                return "周" + "、周".join(days)
            elif "-" in field:
                start, end = map(int, field.split("-"))
                return f"从周{mapping[start % 7]}到周{mapping[end % 7]}"
            else:
                return f"周{mapping[int(field) % 7]}"

        parts = [
            field_to_chinese(minute, "分钟"),
            field_to_chinese(hour, "小时"),
            field_to_chinese(day, "日") if week == "*" else "",
            field_to_chinese(month, "月"),
            weekday_to_chinese(week) if week != "*" else ""
        ]
        parts = [p for p in parts if p]
        if not parts:
            return "每分钟执行一次任务"

    return ",".join(parts) + " 执行一次任务"

# 示例
print(parse_cron_to_chinese("0 8 * * 1"))      # 每周一 08:00 执行一次任务
print(parse_cron_to_chinese("30 9 1 * *"))     # 每月1日 09:30 执行一次任务
print(parse_cron_to_chinese("*/10 * * * *"))   # 每10分钟 执行一次任务
print(parse_cron_to_chinese("* * * * *"))      # 每分钟执行一次任务
print(parse_cron_to_chinese("07 */4 * * *"))   # 在第07分钟,每4小时 执行一次任务
print(parse_cron_to_chinese("* 08 * * *"))     # 每天 08:00 ~ 08:59 每分钟 执行一次任务
print(parse_cron_to_chinese("00 08 * * *"))    # 每天 08:00 执行一次任务

你可能感兴趣的:(Python,python,开发语言,前端)