欢迎加入开源鸿蒙PC社区: https://harmonypc.csdn.net/
欢迎在PC社区平台申请新建项目:https://atomgit.com/OpenHarmonyPCDeveloper
AtomGit 仓库地址:https://atomgit.com/OpenHarmonyPCDeveloper/ohos_python_numpy

本文介绍在鸿蒙 PC+CodeArts IDE 搭建 Python 开发环境。借助鸿蒙专属包管理器 Harmonybrew 安装适配版 Python,搭配 ohos-pip-autosign 自动签名工具,解决系统对动态库的签名限制。通过虚拟环境隔离依赖,以 NumPy 完成安装与脚本测试,成功解决权限报错,搭建出可用的 Python 开发环境。

可以参考OpenHarmony 鸿蒙 PC + CodeArts IDE 实现 Python开发完整开发环境搭建指南


一、库介绍

1. 作用

croniter 是 Python 解析、计算 Cron 表达式 的专用库。
Linux crontab、定时任务框架(APScheduler、Airflow)都使用 cron 表达式 分 时 日 月 星期,croniter 可以根据 cron 字符串,向前/向后推算上一次、下一次执行时间,支持搭配 datetime/arrow 日期对象。

核心能力

  1. 标准 cron 表达式解析:* * * * * 五分制 cron(分 时 日 月 周)
  2. 正向推算:获取下N次执行时间;反向推算:上N次执行时间
  3. 兼容 Python 原生 datetime、dateutil、arrow 时间对象
  4. 支持特殊语法:*/101,3,51-9@daily@hourly
  5. 支持时区、自定义基准时间,不受系统当前时间干扰
  6. 判断当前时间是否匹配 cron 执行规则

业务场景

  1. 定时任务调度系统:计算下次任务执行时刻
  2. 后台配置定时规则,预览未来执行时间点
  3. 日志校验:判断定时任务是否按时触发
  4. 爬虫周期调度、报表定时生成
  5. 定时消息、备份脚本执行时间预判

安装

pip install croniter

请添加图片描述

完整无报错示例代码 croniter_demo.py

from datetime import datetime
from croniter import croniter, croniter_range, CroniterBadCronError

# 基准固定时间,保证运行结果统一
base_time = datetime(2026, 6, 19, 14, 30, 15)

# -------------------------- 示例1:基础用法,获取下一次执行时间 --------------------------
def demo_next_run():
    print("===== 示例1:基础 - 获取下一次执行时间 =====")
    # cron 每5分钟执行一次:*/5 * * * *
    cron_expr = "*/5 * * * *"
    cron = croniter(cron_expr, base_time)
    next1 = cron.get_next(datetime)
    next2 = cron.get_next(datetime)
    print(f"基准时间:{base_time}")
    print(f"Cron规则 {cron_expr} 下一次:{next1}")
    print(f"再下一次:{next2}")
    print("\n")

# -------------------------- 示例2:获取上一次(反向推算) --------------------------
def demo_prev_run():
    print("===== 示例2:反向推算上一次执行时间 =====")
    cron_expr = "0 14 * * *"  # 每天14点整执行
    cron = croniter(cron_expr, base_time)
    prev1 = cron.get_prev(datetime)
    prev2 = cron.get_prev(datetime)
    print(f"基准:{base_time},规则每天14点")
    print(f"上一次执行:{prev1}")
    print(f"上上次:{prev2}")
    print("\n")

# -------------------------- 示例3:批量生成未来N个执行时间(修复count报错,循环get_next兼容所有版本) --------------------------
def demo_range_list():
    print("===== 示例3:批量生成未来10次执行日期 =====")
    cron_expr = "0 9 * * *"  # 每日早上9点
    start = base_time
    cron = croniter(cron_expr, start)
    run_list = []
    # 循环取10次
    for _ in range(10):
        t = cron.get_next(datetime)
        run_list.append(t)
    print(f"Cron {cron_expr} 未来10次执行:")
    for t in run_list:
        print("  ", t)
    print("\n")

# -------------------------- 示例4:各类常用 cron 表达式演示 --------------------------
def demo_common_cron():
    print("===== 示例4:常用定时Cron表达式一览 =====")
    cron_cases = [
        ("* * * * *", "每分钟执行"),
        ("*/10 * * * *", "每10分钟"),
        ("0 * * * *", "每小时整点"),
        ("0 0 * * *", "每日零点"),
        ("0 9 * * *", "每日9点"),
        ("0 0 * * 0", "每周日零点"),
        ("0 0 1 * *", "每月1号零点"),
        ("30 14 19 6 *", "每年6月19日14:30")
    ]
    for expr, desc in cron_cases:
        cron = croniter(expr, base_time)
        next_t = cron.get_next(datetime)
        print(f"{expr:<15} | {desc:<10} 下次执行:{next_t}")
    print("\n")

# -------------------------- 示例5:特殊语法:区间、枚举、步长 --------------------------
def demo_special_syntax():
    print("===== 示例5:区间 1-9、多值 1,3,5、步长 */2 =====")
    # 1-9点每20分执行
    expr1 = "*/20 1-9 * * *"
    # 每周一、三、五 15点整
    expr2 = "0 15 * * 1,3,5"
    cron1 = croniter(expr1, base_time)
    cron2 = croniter(expr2, base_time)
    print(f"规则 {expr1} 下次:{cron1.get_next(datetime)}")
    print(f"规则 {expr2} 下次:{cron2.get_next(datetime)}")
    print("\n")

# -------------------------- 示例6:宏简化语法 @daily @hourly --------------------------
def demo_macro():
    print("===== 示例6:内置宏替代完整cron字符串 =====")
    macro_map = [
        ("@hourly", "0 * * * *"),
        ("@daily", "0 0 * * *"),
        ("@weekly", "0 0 * * 0"),
        ("@monthly", "0 0 1 * *")
    ]
    for macro, expr in macro_map:
        cron_m = croniter(macro, base_time)
        cron_e = croniter(expr, base_time)
        print(f"{macro:<8} 等价 {expr:<12} 下次:{cron_m.get_next(datetime)}")
    print("\n")

# -------------------------- 示例7:异常捕获 - 非法cron表达式校验 --------------------------
def demo_validate_cron():
    print("===== 示例7:校验cron合法性,捕获错误表达式 =====")
    valid_expr = "0 9 * * *"
    invalid_expr = "65 9 * * *"  # 分钟范围0-59,65非法
    try:
        croniter(valid_expr, base_time)
        print(f"表达式 {valid_expr} 合法")
    except CroniterBadCronError as e:
        print(f"合法表达式报错:{e}")

    try:
        croniter(invalid_expr, base_time)
    except CroniterBadCronError as e:
        print(f"表达式 {invalid_expr} 非法,错误:{e}")
    print("\n")

# -------------------------- 示例8:判断当前时间是否命中cron规则 --------------------------
def demo_is_match():
    print("===== 示例8:判断时间是否匹配定时规则 =====")
    cron_expr = "30 14 * * *"  # 每日14:30
    time_match = datetime(2026, 6, 19, 14, 30, 0)
    time_not = datetime(2026, 6, 19, 15, 0, 0)
    print(f"规则:{cron_expr}")
    print(f"{time_match} 是否匹配:{croniter.match(cron_expr, time_match)}")
    print(f"{time_not} 是否匹配:{croniter.match(cron_expr, time_not)}")
    print("\n")

# -------------------------- 统一入口执行全部示例 --------------------------
def run_all():
    demo_next_run()
    demo_prev_run()
    demo_range_list()
    demo_common_cron()
    demo_special_syntax()
    demo_macro()
    demo_validate_cron()
    demo_is_match()
    print("🎉 croniter 全部示例执行完成,无报错")

if __name__ == "__main__":
    run_all()

请添加图片描述


一、头部导入与基准时间

from datetime import datetime
from croniter import croniter, croniter_range, CroniterBadCronError

# 基准固定时间,保证运行结果统一
base_time = datetime(2026, 6, 19, 14, 30, 15)
  1. datetime:Python 原生时间对象,用来承载计算出来的执行时刻;
  2. croniter:核心类,解析 cron 表达式、推算上一次/下一次执行时间;
  3. croniter_range:可选工具,用于生成一段时间区间内所有命中 cron 的时刻(本代码改用循环兼容低版本);
  4. CroniterBadCronError:异常类,捕获格式错误、数值越界的非法 cron;
  5. base_time:固定基准时间,不依赖系统当前真实时间,每次运行输出结果完全一致,方便对比验证。

Cron 基础格式说明(五分制,Linux 标准)

分 时 日 月 星期

  • 分:0~59
  • 时:0~23
  • 日:1~31
  • 月:1~12
  • 星期:0=周日、1=周一 …… 6=周六

示例1:get_next() 正向推算下一次执行时间 demo_next_run

cron_expr = "*/5 * * * *"
cron = croniter(cron_expr, base_time)
next1 = cron.get_next(datetime)
next2 = cron.get_next(datetime)
  1. */5 * * * * 含义:每5分钟执行一次;
  2. croniter(表达式, 基准时间) 创建计算器;
  3. .get_next(datetime):向后推算下一个满足规则的时间,返回 datetime 对象;
  4. 多次调用会持续向后滚动,不断获取更靠后的执行点;
    业务用途:定时调度框架计算任务下次触发时间。

示例2:get_prev() 反向推算上一次执行时间 demo_prev_run

cron_expr = "0 14 * * *"
cron = croniter(cron_expr, base_time)
prev1 = cron.get_prev(datetime)
  1. 0 14 * * *:每天14点整执行;
  2. .get_prev(datetime) 向前推算上一次命中 cron 的时间;
    业务用途:统计任务上次执行记录、判断是否漏跑、补执行逻辑。

示例3:批量生成未来10次执行时间(兼容全版本修复写法)demo_range_list

cron = croniter(cron_expr, start)
run_list = []
for _ in range(10):
    t = cron.get_next(datetime)
    run_list.append(t)

修复背景

高版本 croniter 的 croniter_range 才有 count 参数,低版本不支持,会直接抛参数报错;
通用兼容方案:循环调用 get_next 固定次数收集结果,所有版本都能运行。
业务用途:后台定时任务配置预览,展示未来一批执行时间给用户看。

示例4:常用 Cron 模板合集 demo_common_cron

整理开发最常用的8种定时规则,覆盖报表、备份、推送场景:

  • * * * * * 每分钟;
  • */10 * * * * 每10分钟;
  • 0 * * * * 每小时整点;
  • 0 0 * * * 每日零点;
  • 0 9 * * * 每日早上9点;
  • 0 0 * * 0 每周日零点;
  • 0 0 1 * * 每月1号零点;
  • 30 14 19 6 * 每年6月19日14:30;
    循环批量创建 croniter 对象,打印每条规则的下一次执行时间,可直接复制到业务配置。

示例5:Cron 高级特殊语法 demo_special_syntax

演示三种 cron 标准高级写法:

  1. 步长 */20:每20分钟;搭配区间 1-9,代表1点~9点区间内生效;
  2. 多枚举 1,3,5:周一、周三、周五单独生效;
    适用场景:工作日定时、分段限流任务。

示例6:内置简化宏 Macro demo_macro

cron 提供内置别名,替代完整五段表达式,可读性更高:

  • @hourly = 0 * * * * 每小时;
  • @daily = 0 0 * * * 每天;
  • @weekly = 0 0 * * 0 每周;
  • @monthly = 0 0 1 * * 每月;
    代码同时生成宏与原始表达式的执行时间,对比结果完全一致。

示例7:cron 表达式合法性校验 + 异常捕获 demo_validate_cron

invalid_expr = "65 9 * * *"
try:
    croniter(invalid_expr, base_time)
except CroniterBadCronError as e:
    print(...)
  1. 非法示例:分钟字段 65,超出 0~59 合法范围;
  2. 捕获 CroniterBadCronError,不会让整个程序崩溃;
    业务用途:前端提交定时配置时做后端校验,拦截非法 cron 字符串。

示例8:croniter.match() 判断某个时刻是否匹配定时规则 demo_is_match

croniter.match(cron_expr, time_match)

传入 cron 表达式 + 任意一个 datetime,返回布尔值:

  • True:该时间点刚好满足定时规则;
  • False:不匹配;
    业务用途:定时巡检、实时判断当前时刻是否该触发任务、核对日志触发时间是否符合配置。

统一入口 run_all()

按顺序依次执行8个场景函数,全部跑完打印完成提示;
if __name__ == "__main__" 控制逻辑:只有直接运行当前脚本时才执行全部示例,被其他文件 import 导入时不会自动执行。

croniter 核心优势总结

  1. 完全兼容 Linux 原生 crontab 语法,线上定时脚本、调度器规则统一无差异;
  2. 支持正向/双向时间推算,批量生成执行序列;
  3. 自带完整表达式校验,拦截非法定时配置;
  4. 原生适配 Python datetime,无需额外格式转换;
  5. 支持区间、多值、步长、宏全部 cron 高级语法;
  6. 轻量无重型依赖,APScheduler、Airflow、自研调度系统底层通用依赖。

典型业务场景

  1. 定时任务调度器:计算任务下一次运行时间;
  2. 后台管理系统:定时配置预览功能,展示未来执行列表;
  3. 数据报表:每日/月度定时生成,预判执行窗口;
  4. 日志巡检:核对定时任务是否按时触发、有无漏跑;
  5. 爬虫周期抓取、定时消息推送、数据库备份脚本时间计算。

安装运行命令

pip install croniter
python main.py

逐段功能详解

1. 基础结构说明

Cron 标准五分制格式:分 时 日 月 星期
取值范围:

  • 分:0~59
  • 时:0~23
  • 日:1~31
  • 月:1~12
  • 星期:0~6(0=周日,6=周六)

示例1 get_next()

正向推算下一次触发时间,多次调用持续获取往后的执行点,定时任务核心方法。

示例2 get_prev()

反向推算上一次触发时间,用于统计任务上次执行记录、补跑判断。

示例3 croniter_range

批量生成连续N个执行时间,快速预览未来一批定时节点,后台配置预览功能专用。

示例4 常用 cron 模板

覆盖开发90%场景:每分钟、每小时、每日、每周、每月、固定日期,可直接复制使用。

示例5 特殊语法

  1. */N:每隔N单位执行一次(*/10 每10分钟)
  2. a-b:区间范围 1-9 1点到9点
  3. a,b,c:多枚举值 1,3,5 周一三五

示例6 内置宏简化写法

不用写完整五段字符串,内置别名:
@hourly / @daily / @weekly / @monthly

示例7 表达式合法性校验

捕获 CroniterBadCronError,校验前端/配置传入的 cron 是否格式正确,避免程序崩溃。

示例8 croniter.match()

传入任意时间,判断该时刻是否满足定时规则,用于巡检、任务触发校验。

核心优势

  1. 标准兼容 Linux crontab 语法,和线上定时脚本完全统一;
  2. 支持正向/双向时间推算,批量生成执行序列;
  3. 自带表达式校验,拦截非法定时配置;
  4. 原生搭配 datetime,无需额外转换;
  5. 支持宏、区间、步长、多值全部 cron 高级语法;
  6. 轻量无复杂依赖,调度框架底层通用组件。

典型业务场景总结

  1. APScheduler、自定义定时调度器:计算下次运行时间;
  2. 后台管理系统:定时任务配置预览,展示未来执行列表;
  3. 数据报表:每日/每月定时生成,预判执行窗口;
  4. 日志巡检:核对定时任务是否按时执行;
  5. 爬虫周期调度,批量生成抓取时间;
  6. 定时消息推送、数据库备份脚本时间计算。
Logo

赋能鸿蒙PC开发者,共建全场景原生生态,共享一次开发多端部署创新价值。

更多推荐