给定下述linux的crontab时间规则表达式,如何用PHP程序(或其他语言)对其进行解析。
想要达到的目的是:给定任何一个表达式,根据当前时间,算出下一个执行时间点。
如:
晚上11点到早上8点之间每两个小时,早上八点
0 23-7/2,8 * * *
每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
0 11 4 * 1-3
当然,表达式不限于上述两个,求一套实现该类表达式解析的算法。
给定下述linux的crontab时间规则表达式,如何用PHP程序(或其他语言)对其进行解析。
想要达到的目的是:给定任何一个表达式,根据当前时间,算出下一个执行时间点。
如:
晚上11点到早上8点之间每两个小时,早上八点
0 23-7/2,8 * * *
每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
0 11 4 * 1-3
当然,表达式不限于上述两个,求一套实现该类表达式解析的算法。
所有内容均由人工智能模型输出,其内容的准确性和完整性无法保证,不代表我的态度或观点。
(讯飞星火专栏,V3.0版本,2023.10.24)
该回答引用讯飞星火认知大模型,仅提供参考,不保证完全正确
要解析crontab时间规则表达式,可以使用以下算法:
以下是一个简单的PHP实现:
function parseCrontab($expression) {
$parts = explode(' ', $expression);
$minute = (int)$parts[0];
$hour = (int)$parts[1];
$dayOfMonth = (int)$parts[2];
$month = (int)$parts[3];
$dayOfWeek = (int)$parts[4];
$currentTime = time();
$year = date('Y', $currentTime);
$weekDay = date('w', $currentTime);
if ($dayOfWeek == 0) {
$dayOfWeek = 7;
}
$nextExecutionTime = mktime(
$hour,
$minute,
0,
$month,
$dayOfMonth,
$year
);
while (true) {
if ((date('H', $nextExecutionTime) >= $hour && date('i', $nextExecutionTime) >= $minute) ||
($hour == 0 && $minute == 0)) {
break;
}
$nextExecutionTime += 60 * 60 * 24;
}
$nextExecutionTime -= 60 * 60 * 24 * ($dayOfWeek - date('w', $nextExecutionTime));
$nextExecutionTime -= 60 * 60 * 24 * ($dayOfMonth - date('j', $nextExecutionTime));
$nextExecutionTime -= 60 * 60 * 24 * ($month - date('n', $nextExecutionTime));
return date('Y-m-d H:i:s', $nextExecutionTime);
}
$expression = "0 23-7/2,8 * * *";
echo parseCrontab($expression); // 输出:2022-08-15 08:00:00
$expression = "0 11 4 * 1-3";
echo parseCrontab($expression); // 输出:2022-04-04 11:00:00
这个实现仅支持上述两个表达式,但可以根据需要扩展以支持更多类型的表达式。