袁来如此的工作笔记
袁来如此的工作笔记
竹杖芒鞋轻胜马,谁怕? 一蓑烟雨任平生。

Crond时间规则验证算法

浏览量:126

namespace app\extend;
 
class CrondTime{
public static function check($format,$check_time = 0)
{
$time = intval($check_time) > 0 ? $check_time : time();
$cNumber = [
date('i',$time), //分 0 - 59
date('H',$time), //时 0 - 23
date('j',$time), //日期, 1- 31
date('m',$time), //月 1 - 12
date('w',$time), //周 星期中的第几天 0(周日)至6(周六)
];
 
$cronArr = explode(' ',$format);
//逐个检查,非*全符合则返回true,否则返回false
for($i = 0; $i<5;$i++){
if($cronArr[$i] == '*' || empty($cronArr[$i])) continue;
if(self::checkNumber($cNumber[$i],$cronArr[$i]) === false){
return false;
}
}
return true;
}
 
/**
* 检查一个数字是否符合
* @param $number 要检查的数字
* @param $str 规则字符
* @return bool 符合返回true
*/
private function checkNumber($number,$str)
{
if(strpos($str,'/') === false && strpos($str,',') === false && strpos($str,'-') === false){
//单数
if($number == $str) return true;
return false;
}
//检查是否含有'/'
if(strpos($str,'/') === false){
//不含'/'
if(strpos($str,',') !== false){
//集合
if(in_array($number,explode(',',$str))) return true;
return false;
}
 
if(strpos($str,'-') !== false){
//区间
$areaArr = explode('-',$str);
$min = intval(trim($areaArr[0]));
$max = intval(trim($areaArr[1]));
if($number >= $min && $number <= $max) return true;
return false;
}
}else{
//有 '/' ,分左右两部分,左边检查集合、区间。右侧检查余数是否为0
$leftCheck = $rightCheck = false;
$tmp = explode('/',$str);
$leftStr = $tmp[0];
$rightStr = $tmp[1];
 
//如果左侧是*的话,右侧为数字则取模
$leftCheck = self::checkLevel3($number,$leftStr,true);
$rightCheck = self::checkLevel3($number,$rightStr,false);
if($leftCheck===true && $rightCheck === true) return true;
return false;
}
}
 
/**
* 检查3级字符
* @param $number
* @param $str
* @param bool $is_left
* @return bool
*/
private function checkLevel3($number,$str,$is_left = false){
if($str === '*') return true;
//三级中已经没有 '/' ,只需要检查是否是单数、集合、区间。
if(strpos($str,',') === false && strpos($str,'-') === false){
if($is_left === true){
if($number == $str) return true;
return false;
}else{
//echo $number;exit();
//右侧单数,进行取模运算
if($number%$str == 0) return true;
return false;
}
 
}
if(strpos($str,',') !== false){
//集合
if(in_array($number,explode(',',$str))) return true;
return false;
}
 
if(strpos($str,'-') !== false){
//区间
$areaArr = explode('-',$str);
$min = intval(trim($areaArr[0]));
$max = intval(trim($areaArr[1]));
if($number >= $min && $number <= $max) return true;
return false;
}
}
}
打赏