Calculate when a cron job will be executed then next time

后端 未结 8 955
庸人自扰
庸人自扰 2020-12-02 08:19

I have a cron \"time definition\"

1 * * * * (every hour at xx:01)
2 5 * * * (every day at 05:02)
0 4 3 * * (every third day of the month at 04:00)
* 2 * * 5          


        
8条回答
  •  情书的邮戳
    2020-12-02 08:45

    Thanks for posting this code. It definitely helped me out, even 6 years later.

    Trying to implement I found a small bug.

    date('i G j n w', $time) returns a 0 padded integer for the minutes.

    Later in the code, it does a modulus on that 0 padded integer. PHP doesn't seem to handle this as expected.

    $ php
    
    3
    0
    

    As you can see, 08 % 5 returns 0, whereas 8 % 5 returns the expected 3. I couldn't find a non padded option for the date command. I tried fiddling with the {$time[$k]} % $1 === 0 line (like changing {$time[$k]} to ({$time[$k]}+0), but couldn't get it to drop the 0 padding during the modulus.

    So, I ended up just changing the original value returned by the date function and removed the 0 by running $time[0] = $time[0] + 0;.

    Here is my test.

     &$v) {
            $v = explode(',', $v);
            $regexps = array(
                '/^\*$/', # every 
                '/^\d+$/', # digit 
                '/^(\d+)\-(\d+)$/', # range
                '/^\*\/(\d+)$/' # every digit
            );
            $content = array(
                "true", # every
                "{$time[$k]} === $0", # digit
                "($1 <= {$time[$k]} && {$time[$k]} <= $2)", # range
                "{$time[$k]} % $1 === 0" # every digit
            );
            foreach ($v as &$v1)
                $v1 = preg_replace($regexps, $content, $v1);
                $v = '('.implode(' || ', $v).')';
        }
        $crontab = implode(' && ', $crontab);
        return eval("return {$crontab};");
    }
    
    for($i=0; $i<24; $i++) {
        for($j=0; $j<60; $j++) {
            $date=sprintf("%d:%02d",$i,$j);
            if (parse_crontab('*/5 * * * *',$date)) {
                 print "$date yes\n";
            } else {
                 print "$date no\n";
            }
        }
    }
    
    ?>
    

提交回复
热议问题