hmuenzer/recurrence

该工具帮助进行rrule评估,如RFC 5545定义

dev-master 2019-03-29 09:54 UTC

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'
      );

?>