hmuenzer / recurrence
该工具帮助进行rrule评估,如RFC 5545定义
dev-master
2019-03-29 09:54 UTC
Requires
- php: >=5.3.6
This package is auto-updated.
Last update: 2024-09-07 14:34:24 UTC
README
这个PHP类是我一个闭源PHP项目的一部分。
我经常使用开源软件,所以是时候回馈一些东西了。
这里有一些基于PHP的脚本也能进行计算,但它们要么不完整,要么相当复杂(也不完整)。
如果你只需要计算,这可能会帮到你。
所以,这就是它。
如何使用此工具
<?php
use \hmuenzer\Recurrence;
require_once('./src/Recurrence.php');
$options = array(
'dtstart' => '19970902T090000',
'dtend' => '19970902T100000',
'tzid' => 'America/New_York',
'rrule' => 'FREQ=WEEKLY;UNTIL=19971007T000000Z;WKST=SU;BYDAY=TU,TH'
);
$recurrence = new Recurrence($options);
$recurrence->format = 'Ymd\THisO';
while($date = $recurrence->next()){
print_r($date);
if($z++ > 100) break;
}
?>
特性列表
此类支持RFC 5545定义的“VEVENT”、“VTODO”或“VJOURNAL”单个日历组件的所有 recurrence 属性
- EXDATE, RDATE 和 RRULE
- DTSTART, DTEND 和 DURATION
- 频率:从 SECONDLY 到 YEARLY
- INTERVAL, COUNT 和 UNTIL
- 所有 BYxxx 规则部分以及所有可能的组合(即使是疯狂的组合)
- WKST 和 TZID(如RFC 5545指定的周编号)
- 重复纪念日/全天事件
不支持通过 RECURRENCE-ID 定义的异常,因为这需要解析整个 ical 文件,而这个类无法做到这一点。时区计算使用 PHP 支持的时区信息,而不是 VTIMEZONE 日历组件定义的时区信息。
更多示例
<?php
//use of duration, rdate and exdate
$options = array(
'dtstart' => '20121125T140000',
'duration' => 'PT1H',
'tzid' => 'Europe/Berlin',
'rrule' => 'FREQ=YEARLY;BYMONTH=1,3,5,7,9,11;BYDAY=-1SU;COUNT=10',
'rdate' => '20130127T140000/20121125T143000,20130224T140000/PT3H',
'exdate' => '20130929T140000,20130728T140000'
);
//define rule parts separately, allday events and specify a range
$options = array(
'dtstart' => '19671224',
'dtend' => '19671225',
'tzid' => 'Europe/Berlin',
'freq' => 'YEARLY',
'after' => '20120101T000000Z',
'before' => '20130101T000000Z'
);
//the class calculates a value "x-reccurence"
//if you don't need this, you can do "skip not in range" to safe computing time
//this property is ignored if a COUNT rule is specified
//you can specify the output format
//skip_not_in_range and format can not be passed to the constructor
$options = array(
'dtstart' => '20120131T150000',
'dtend' => '20120131T153000',
'tzid' => 'Europe/Berlin',
'rrule' => 'FREQ=MONTHLY;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=-1',
'after' => '20120101T000000Z',
'before' => '20130101T000000Z'
);
$recurrence = new Recurrence($options);
$recurrence->format = 'Ymd\THis';
$recurrence->skipNotInRange = TRUE;
//multiple separate rdate and exdate rules
$options['dtstart'] = '20121125T140000';
$options['duration'] = 'PT1H';
$options['tzid'] = 'Europe/Berlin';
$options['rrule'] = 'FREQ=YEARLY;BYMONTH=1,3,5,7,9,11;BYDAY=-1SU;COUNT=10';
$options['rdate'][] = '20130127T140000';
$options['rdate'][] = '20130224T140000';
$options['exdate'][] = '20130929T140000';
$options['exdate'][] = '20130728T140000';
//error handling
$options = array(
'dtstart' => '20120131T150000',
'rrule' => 'FREQ=MONTHLY;BYWEEKNO=1,2,3' //invalid RRULE
);
$recurrence = new Recurrence($options);
if($recurrence->error){
//error routine here
}
?>
一些疯狂规则
<?php
//every 29th december that is calendar week one
$options = array(
'dtstart' => '20031229T150000',
'rrule' => 'FREQ=YEARLY;BYMONTH=12;BYMONTHDAY=29;BYWEEKNO=1'
OR
'rrule' => 'FREQ=YEARLY;BYYEARDAY=-3;BYWEEKNO=1'
);
//every 3rd january that is in the last calendar week of the previous year
$options = array(
'dtstart' => '20100103T150000',
'rrule' => 'FREQ=YEARLY;BYMONTH=1;BYMONTHDAY=3;BYWEEKNO=-1'
OR
'rrule' => 'FREQ=YEARLY;BYYEARDAY=3;BYWEEKNO=-1'
);
//every 31th that is a Friday
$options = array(
'dtstart' => '20000131T090000',
'rrule' => 'FREQ=MONTHLY;BYMONTHDAY=31;BYDAY=FR'
);
?>