crazynds/interval-expression

为日历创建复杂区间

v1.0.4 2022-06-26 21:07 UTC

This package is auto-updated.

Last update: 2024-09-27 01:54:03 UTC


README

Latest Stable Version Total Downloads License

用于表示无法使用cron达到的重复的日历时间表区间的系统。

安装

  1. 安装包
composer require crazynds/interval-expression
  1. 检查表达式是否有效
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
}
  1. 在生成器中迭代
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