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

请教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
    

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

    评论

报告相同问题?

悬赏问题

  • ¥30 matlab解优化问题代码
  • ¥15 写论文,需要数据支撑
  • ¥15 identifier of an instance of 类 was altered from xx to xx错误
  • ¥100 反编译微信小游戏求指导
  • ¥15 docker模式webrtc-streamer 无法播放公网rtsp
  • ¥15 学不会递归,理解不了汉诺塔参数变化
  • ¥15 基于图神经网络的COVID-19药物筛选研究
  • ¥30 软件自定义无线电该怎样使用
  • ¥15 R语言mediation包做中介分析,直接效应和间接效应都很小,为什么?
  • ¥15 Jenkins+k8s部署slave节点offline