crazynds / interval-expression
为日历创建复杂区间
v1.0.4
2022-06-26 21:07 UTC
Requires
- php: >=7.0
- nesbot/carbon: ^2.0
README
用于表示无法使用cron达到的重复的日历时间表区间的系统。
安装
- 安装包
composer require crazynds/interval-expression
- 检查表达式是否有效
use Crazynds\IntervalExpression\Interval; $interval = new Interval(); // Expression for every 1 week on monday, wednesday and friday $expression = '1 weekly 1,3,5'; if($interval->validate($expression)){ //is valid expression $interval->parse($expression); } if($interval->parse($expression)){ //this way check if the expression is valid too and apply the expression in the interval }
- 在生成器中迭代
use Carbon\Carbon; use Crazynds\IntervalExpression\Interval; $dateStart = Carbon::parse('12-06-2022 14:30:00'); $dateEnd = Carbon::parse('01-08-2030 18:30:00'); $interval = new Interval(); // Expression for every 1 week on monday, wednesday and friday $expression = '1 weekly 1,3,5'; $dates = []; if($interval->parse($expression)){ $generator = $interval->generator($dateStart,$dateEnd); $started = $generator->current()->format('d-m-Y H:i:s'); while($generator->hasNext()){ $dates[] = $generator->next()->format('d-m-Y H:i:s'); } } var_dump($dates);
表达式定义
[0-9]+ (daily|weekly|monthly|yearly) {rules}*
-
daily没有规则
-
weekly规则
- {day of week [0-9]},{day of week [0-9]},...
- 0,3,5 => (Sunday, Wednesday and Friday)
- 1 => (Monday)
- * => (any 1 day of week)
-
monthly规则
- {day of month [0-30]},{day of month [0-30]},...
- 12,15 => (day 12 and 15 of every month iteration)
- 10 => (day 10 of every month iteration)
- * => (any 1 day of month)
-
yearly
- {day of year [0-365]},{day of year [0-365]},...
- 12,15 => (day 12 and 15 of every year iteration)
- 1 => (first day of every year iteration)
- * => (any 1 day of year)
可以有多个规则,每次迭代都会循环遍历它们。例如:如果有两个规则,第三次迭代将使用第一个规则。
示例
"2 weekly 1,5"
描述:每两周的星期一和星期五
初始日期:2022-06-12 14:30:00
输出
- "2022-06-13 14:30:00" (星期一)
- "2022-06-17 14:30:00" (星期五)
- "2022-06-27 14:30:00" (星期一)
- "2022-07-01 14:30:00" (星期五)
"2 weekly 1 5"
描述:每两周,第一个发生的时间是星期一,第二个是星期五。
初始日期:2022-06-12 14:30:00
输出
- "2022-06-13 14:30:00" (星期一)
- "2022-07-01 14:30:00" (星期五)
- "2022-07-11 14:30:00" (星期一)
- "2022-07-29 14:30:00" (星期五)
"2 weekly 1,5 5"
描述:每两周,第一次发生的时间是星期一和星期五,第二次只在星期五。
初始日期:2022-06-12 14:30:00
输出
- "2022-06-13 14:30:00" (星期一)
- "2022-06-17 14:30:00" (星期五)
- "2022-07-01 14:30:00" (星期五)
- "2022-07-11 14:30:00" (星期一)
"1 monthly 0,14 19"
描述:每月,第一次发生在每月的1日和15日,第二次只在20日。
初始日期:2022-06-12 14:30:00
输出
- "2022-06-15 14:30:00" (15日)
- "2022-07-20 14:30:00" (20日)
- "2022-08-01 14:30:00" (1日)
- "2022-08-15 14:30:00" (15日)
测试并支持的PHP版本
- 8.X
- 7.X