OKMAN2009 2013-12-06 06:29 采纳率: 0%
浏览 1353

请教crontab时间规则解析算法

给定下述linux的crontab时间规则表达式,如何用PHP程序(或其他语言)对其进行解析。
想要达到的目的是:给定任何一个表达式,根据当前时间,算出下一个执行时间点。
如:
晚上11点到早上8点之间每两个小时,早上八点
0 23-7/2,8 * * *

每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
0 11 4 * 1-3

当然,表达式不限于上述两个,求一套实现该类表达式解析的算法。

  • 写回答

1条回答

  • ChatGPTᴼᴾᴱᴺᴬᴵ 2023-12-09 19:13
    关注

    所有内容均由人工智能模型输出,其内容的准确性和完整性无法保证,不代表我的态度或观点。
    (讯飞星火专栏,V3.0版本,2023.10.24)


    该回答引用讯飞星火认知大模型,仅提供参考,不保证完全正确
    要解析crontab时间规则表达式,可以使用以下算法:

    1. 首先,将给定的crontab表达式分割成各个部分。
    2. 然后,根据每个部分的规则,计算出下一个执行时间点。

    以下是一个简单的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
    

    这个实现仅支持上述两个表达式,但可以根据需要扩展以支持更多类型的表达式。

    评论

报告相同问题?

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog