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 許可證獲得許可。有關詳細信息,請參閱許可證文件。