コード例 #1
0
 /**
  * Parse an iCal rule into a parsed RRULE array, along with EXDATE
  * and RDATE arrays.
  */
 public static function split_rrule($rrule)
 {
     $parts = self::split_multiline_entry($rrule);
     $rrule = array();
     $exceptions = array();
     $additions = array();
     $additions = array();
     foreach ($parts as $part) {
         if (strstr($part, 'RRULE')) {
             $RRULE = str_replace('RRULE:', '', $part);
             $rrule = (array) self::parse_rrule($RRULE);
         } elseif (strstr($part, 'EXDATE')) {
             $EXDATE = str_replace('EXDATE:', '', $part);
             $exceptions = (array) DateiCalParse::parse_exceptions($EXDATE);
             unset($exceptions['DATA']);
         } elseif (strstr($part, 'RDATE')) {
             $RDATE = str_replace('RDATE:', '', $part);
             $additions = (array) DateiCalParse::parse_exceptions($RDATE);
             unset($additions['DATA']);
         }
     }
     return array($rrule, $exceptions, $additions);
 }
コード例 #2
0
 /**
  * Compute dates that match the requested rule, within a specified
  * date range.
  *
  * @param string $rrule
  *   A string RRULE, in the standard iCal format.
  * @param object $start
  *   A date object to start the series.
  * @param object $end
  *   A date object to end the series, if not ended earlier by UNTIL
  *   or COUNT. Requred unless a COUNT is provided.
  * @param array $this->exceptions
  *   Optional array of exception dates, each in the standard ISO format
  *   of YYYY-MM-DD.
  * @param array $additions
  *   Optional array of additional dates, each in the standard ISO format
  *   of YYYY-MM-DD.
  */
 function __construct($rrule, $start, $end = NULL, $exceptions = array(), $additions = array())
 {
     // Get the parsed array of rule values.
     $this->rrule = DateiCalParse::parse_rrule($rrule);
     // Create a date object for the start and end dates, if valid.
     $this->start_date = $start;
     $this->end_date = $end;
     $this->timezone_name = $this->start_date->getTimezone()->getName();
     // Make sure we have something we can work with.
     if (!$this->isValid()) {
         return FALSE;
     }
     // If the rule has an UNTIL, see if that is earlier than the end date.
     if (!empty($this->rrule['UNTIL'])) {
         $until_date = DateiCalParse::ical_date($this->rrule['UNTIL'], $this->timezone_name);
         if (empty($this->end_date) || $until_date < $this->end_date) {
             $this->end_date = $until_date;
         }
     }
     // Versions of PHP greater than PHP 5.3.5 require that we set an
     // explicit time when using date_modify() or the time may not match
     // the original value. Adding this modifier gives us the same
     // results in both older and newer versions of PHP.
     $this->time_string = ' ' . $this->start_date->format('g:ia');
     $this->max_count = isset($this->rrule['COUNT']) ? $this->rrule['COUNT'] : NULL;
     $this->exceptions = $exceptions;
     $this->additions = $additions;
 }