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
    

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

    评论

报告相同问题?

悬赏问题

  • ¥15 Python时间序列如何拟合疏系数模型
  • ¥15 求学软件的前人们指明方向🥺
  • ¥50 如何增强飞上天的树莓派的热点信号强度,以使得笔记本可以在地面实现远程桌面连接
  • ¥15 MCNP里如何定义多个源?
  • ¥20 双层网络上信息-疾病传播
  • ¥50 paddlepaddle pinn
  • ¥20 idea运行测试代码报错问题
  • ¥15 网络监控:网络故障告警通知
  • ¥15 django项目运行报编码错误
  • ¥15 STM32驱动继电器