Recurr 是一个 PHP 库,用于处理重复规则 (RRULE) 并将其转换为 DateTime 对象。
Recurr 是作为具有重复事件的日历的先驱而开发的,并且深受 rrule.js 的启发。
推荐的安装 Recurr 的方法是通过 Composer。
composer require simshaun/recurr
您可以通过传递 (RRULE) 字符串或包含规则部分、开始日期、结束日期(可选)和时区的数组来创建新的规则对象。
$ timezone = ' America/New_York ' ;
$ startDate = new DateTime ( ' 2013-06-12 20:00:00 ' , new DateTimeZone ( $ timezone ));
$ endDate = new DateTime ( ' 2013-06-14 20:00:00 ' , new DateTimeZone ( $ timezone )); // Optional
$ rule = new Recurr Rule ( ' FREQ=MONTHLY;COUNT=5 ' , $ startDate , $ endDate , $ timezone );
您还可以使用链式方法以编程方式构建规则并获取生成的 RRULE。
$ rule = ( new Recurr Rule )
-> setStartDate ( $ startDate )
-> setTimezone ( $ timezone )
-> setFreq ( ' DAILY ' )
-> setByDay ([ ' MO ' , ' TU ' ])
-> setUntil ( new DateTime ( ' 2017-12-31 ' ))
;
echo $ rule -> getString (); //FREQ = DAILY ; UNTIL=20171231T000000 ; BYDAY=MO , TU
$ transformer = new Recurr Transformer ArrayTransformer ();
print_r ( $ transformer -> transform ( $ rule ));
$transformer->transform(...)
返回Recurrence
对象的RecurrenceCollection
。Recurrence
都有getStart()
和getEnd()
方法,它们返回DateTime
对象。Rule
缺少结束日期, getEnd()
将返回一个与getStart()
相同的DateTime
对象。注意:转换器对其生成的对象数量有一个“虚拟”限制(默认为 732)。这可以防止脚本因无限重复的规则而崩溃。您可以使用传递给
ArrayTransformer
ArrayTransformerConfig
对象更改虚拟限制。
ArrayTransformer 使用约束来允许或阻止将某些日期添加到RecurrenceCollection
中。 Recurr 提供以下约束:
AfterConstraint(DateTime $after, $inc = false)
BeforeConstraint(DateTime $before, $inc = false)
BetweenConstraint(DateTime $after, DateTime $before, $inc = false)
$inc
定义了如果$after
或$before
本身是循环时会发生什么。如果$inc = true
,它们将包含在集合中。例如,
$ startDate = new DateTime ( ' 2014-06-17 04:00:00 ' );
$ rule = new Recurr Rule ( ' FREQ=MONTHLY;COUNT=5 ' , $ startDate );
$ transformer = new Recurr Transformer ArrayTransformer ();
$ constraint = new Recurr Transformer Constraint BeforeConstraint ( new DateTime ( ' 2014-08-01 00:00:00 ' ));
print_r ( $ transformer -> transform ( $ rule , $ constraint ));
注意:如果构建您自己的约束,重要的是要知道不满足约束要求的日期不计入变压器的虚拟限制。如果您手动将约束的
$stopsTransformer
属性设置为false
,变压器可能会因无限循环而崩溃。有关如何防止这种情况的示例,请参阅BetweenConstraint
。
RecurrenceCollection
过滤器RecurrenceCollection
提供以下可链接的辅助方法来过滤重复:
startsBetween(DateTime $after, DateTime $before, $inc = false)
startsBefore(DateTime $before, $inc = false)
startsAfter(DateTime $after, $inc = false)
endsBetween(DateTime $after, DateTime $before, $inc = false)
endsBefore(DateTime $before, $inc = false)
endsAfter(DateTime $after, $inc = false)
$inc
定义了如果$after
或$before
本身是循环时会发生什么。如果$inc = true
,它们将包含在过滤后的集合中。例如,
pseudo...
2014-06-01 startsBetween(2014-06-01, 2014-06-20) // false
2014-06-01 startsBetween(2014-06-01, 2014-06-20, true) // true
注意:
RecurrenceCollection
扩展了 Doctrine 项目的 ArrayCollection 类。
Recurr 支持将一些重复规则转换为人类可读的文本。此功能仍处于测试阶段,仅支持每年、每月、每周和每日频率。
$ rule = new Rule ( ' FREQ=YEARLY;INTERVAL=2;COUNT=3; ' , new DateTime ());
$ textTransformer = new TextTransformer ();
echo $ textTransformer -> transform ( $ rule );
如果您需要的不仅仅是英语,您可以传递具有受支持的语言环境之一的翻译器(请参阅翻译文件夹) 。
$ rule = new Rule ( ' FREQ=YEARLY;INTERVAL=2;COUNT=3; ' , new DateTime ());
$ textTransformer = new TextTransformer (
new Recurr Transformer Translator ( ' de ' )
);
echo $ textTransformer -> transform ( $ rule );
此行为是可配置的:
$ timezone = ' America/New_York ' ;
$ startDate = new DateTime ( ' 2013-01-31 20:00:00 ' , new DateTimeZone ( $ timezone ));
$ rule = new Recurr Rule ( ' FREQ=MONTHLY;COUNT=5 ' , $ startDate , null , $ timezone );
$ transformer = new Recurr Transformer ArrayTransformer ();
$ transformerConfig = new Recurr Transformer ArrayTransformerConfig ();
$ transformerConfig -> enableLastDayOfMonthFix ();
$ transformer -> setConfig ( $ transformerConfig );
print_r ( $ transformer -> transform ( $ rule ));
// 2013-01-31 , 2013-02-28 , 2013-03-31 , 2013-04-30 , 2013-05-31
请随意发表评论或提出拉取请求。请包含带有 PR 的测试。
Recurr 根据 MIT 许可证获得许可。有关详细信息,请参阅许可证文件。