creatcode/crontab-expression

通用 Unix/Linux Cron 表达式的解析、校验与秒级扩展

Maintainers

Package info

github.com/creatcode/crontab-expression

pkg:composer/creatcode/crontab-expression

Transparency log

Statistics

Installs: 38

Dependents: 1

Suggesters: 1

Stars: 0

Open Issues: 0

v1.5.1 2026-08-21 10:35 UTC

This package is auto-updated.

Last update: 2026-08-21 10:36:50 UTC


README

通用 PHP Cron 表达式库,提供表达式解析、校验、执行时间计算与语义化生成能力,并在 Unix/Linux 五段格式基础上提供可选秒字段。

支持以下格式:

  • 分 时 日 月 周:Unix/Linux Cron,内部按秒为 0 执行。
  • 秒 分 时 日 月 周:秒级 Cron。

星期使用 0-7,其中 07 均表示星期日,1-5 分别表示周一至周五。

支持 *,-/ 以及月份、星期的英文缩写;不支持 Quartz 专属的 ?LW# 和年份字段。在“日期”和“星期”均非 * 时,五段与六段表达式均按 Unix 规则处理:任一字段匹配即可执行。

行为约定

本库只负责表达式处理与执行时间计算,任务注册和实际执行由调用方处理。日期和星期同时受限时,五段与六段表达式均遵循 Linux Cron 的 OR 语义。

安装与使用

composer require creatcode/crontab-expression
use Creatcode\Cronexp\CronExpression;

$cron = CronExpression::factory('*/5 * * * *');
$nextRun = $cron->getNextRunDate();

语义化生成 Cron

只需调用一个方法:CronExpression::generate(单位, 间隔, 选项),直接返回 Cron 字符串。默认生成六段表达式;如需计算执行时间,再将结果传给 factory()

use Creatcode\Cronexp\CronExpression;

// 每 5 分钟的第 10 秒执行
$expression = CronExpression::generate('minute', 5, array('second' => 10));
$nextRun = CronExpression::factory($expression)->getNextRunDate();

支持的单位为 secondminutehourdayweekmonth。前四种单位的第二个参数表示间隔;weekmonth 的间隔固定为 1,因为标准 Cron 无法精确表示“每 N 周”或“每 N 月”。

$options 按需传入:second(0-59)、minute(0-59)、hour(0-23)、weekday(0-7)和 day(1-31)。可通过 format 指定输出格式:56

// 五段:*/5 * * * *
$fivePart = CronExpression::generate('minute', 5, array('format' => 5));

// 六段:0 */5 * * * *
$sixPart = CronExpression::generate('minute', 5);

五段格式没有秒字段,因此不能用于 second 调度。

例如,每周一 09:00 执行:

$expression = CronExpression::generate('week', 1, array(
    'weekday' => 1,
    'hour' => 9
));

执行回归测试:composer test

Cron 表达式

格式 字段
五段 分 时 日 月 周
六段 秒 分 时 日 月 周
字段 允许值 特殊字符
0-59 ,-*/
0-59 ,-*/
0-23 ,-*/
1-31 ,-*/
1-12、JAN-DEC ,-*/
0-7、SUN-SAT ,-*/

常用示例:

*/5 * * * *       # 每 5 分钟
*/5 * * * * *     # 每 5 秒
0 */5 * * * *     # 每 5 分钟,在第 0 秒执行
5/20 * * * * *    # 每分钟的第 5、25、45 秒执行
0 0 9 * * MON-FRI # 工作日每天 09:00 执行