function PHPTest() { $result = ''; $start = microtime(true); $rule = new RepeatRule($this->dtstart, $this->recur); $i = 0; while ($date = $rule->next()) { if ($i++ % 4 == 0) { $result .= "\n"; } $result .= " " . $date->format('Y-m-d H:i:s'); if ($i >= $this->result_limit) { break; } } $this->PHP_time = microtime(true) - $start; return $result; }
/** * Expand the event instances for an RRULE property * * @param object $dtstart A RepeatRuleDateTime which is the master dtstart * @param string $property RDATE or EXDATE, depending... * @param array $component A vComponent which is a VEVENT, VTODO or VJOURNAL * @param array $range_end A date after which we care less about expansion * * @return array An array keyed on the UTC dates, referring to the component */ function rrule_expand($dtstart, $property, $component, $range_end, $is_date = null, $return_floating_times = false) { $expansion = array(); $recur = $component->GetProperty($property); if (!isset($recur)) { return $expansion; } $recur = $recur->Value(); $this_start = $component->GetProperty('DTSTART'); if (isset($this_start)) { $this_start = new RepeatRuleDateTime($this_start); } else { $this_start = clone $dtstart; } if ($return_floating_times) { $this_start->setAsFloat(); } // if ( DEBUG_RRULE ) print_r( $this_start ); if (DEBUG_RRULE) { printf("RRULE: %s (floating: %s)\n", $recur, $return_floating_times ? "yes" : "no"); } $rule = new RepeatRule($this_start, $recur, $is_date, $return_floating_times); $i = 0; $result_limit = 1000; while ($date = $rule->next($return_floating_times)) { // if ( DEBUG_RRULE ) printf( "[%3d] %s\n", $i, $date->UTC() ); $expansion[$date->FloatOrUTC($return_floating_times)] = $component; if ($i++ >= $result_limit || $date > $range_end) { break; } } // if ( DEBUG_RRULE ) print_r( $expansion ); return $expansion; }
/** * Expand the event instances for an RRULE property * * @param object $dtstart A RepeatRuleDateTime which is the master dtstart * @param string $property RDATE or EXDATE, depending... * @param array $component A vComponent which is a VEVENT, VTODO or VJOURNAL * @param array $range_end A date after which we care less about expansion * * @return array An array keyed on the UTC dates, referring to the component */ function rrule_expand($dtstart, $property, $component, $range_end) { $expansion = array(); $recur = $component->GetProperty($property); if (!isset($recur)) { return $expansion; } $recur = $recur->Value(); $this_start = $component->GetProperty('DTSTART'); if (isset($this_start)) { $timezone = $this_start->GetParameterValue('TZID'); $this_start = new RepeatRuleDateTime($this_start->Value(), $timezone); } else { $this_start = clone $dtstart; } // print_r( $this_start ); // printf( "RRULE: %s\n", $recur ); $rule = new RepeatRule($this_start, $recur); $i = 0; $result_limit = 1000; while ($date = $rule->next()) { // printf( "[%3d] %s\n", $i, $date->UTC() ); $expansion[$date->UTC()] = $component; if ($i++ >= $result_limit || $date > $range_end) { break; } } // print_r( $expansion ); return $expansion; }
/** * Expand the instances for a STANDARD or DAYLIGHT component of a VTIMEZONE * * @param object $vResource is a VCALENDAR with a VTIMEZONE containing components needing expansion * @param object $range_start A RepeatRuleDateTime which is the beginning of the range for events. * @param object $range_end A RepeatRuleDateTime which is the end of the range for events. * @param int $offset_from The offset from UTC in seconds at the onset time. * * @return array of onset datetimes with UTC from/to offsets */ function expand_timezone_onsets(vCalendar $vResource, RepeatRuleDateTime $range_start, RepeatRuleDateTime $range_end) { global $c; $vtimezones = $vResource->GetComponents(); $vtz = $vtimezones[0]; $components = $vtz->GetComponents(); $instances = array(); $dtstart = null; $is_date = false; $has_repeats = false; $zone_tz = $vtz->GetPValue('TZID'); foreach ($components as $k => $comp) { if (DEBUG_EXPAND) { printf("Starting TZ expansion for component '%s' in timezone '%s'\n", $comp->GetType(), $zone_tz); foreach ($instances as $k => $v) { print ' : ' . $k; } print "\n"; } $dtstart_prop = $comp->GetProperty('DTSTART'); if (!isset($dtstart_prop)) { continue; } $dtstart = new RepeatRuleDateTime($dtstart_prop); $dtstart->setTimeZone('UTC'); $offset_from = $comp->GetPValue('TZOFFSETFROM'); $offset_from = $offset_from / 100 * 3600 + abs($offset_from) % 100 * 60 * ($offset_from < 0 ? -1 : 0); $offset_from *= -1; $offset_from = "{$offset_from} seconds"; dbg_error_log('tz/update', "%s of offset\n", $offset_from); $dtstart->modify($offset_from); $is_date = $dtstart->isDate(); $instances[$dtstart->UTC('Y-m-d\\TH:i:s\\Z')] = $comp; $rrule = $comp->GetProperty('RRULE'); $has_repeats = isset($rrule); if (!$has_repeats) { continue; } $recur = $comp->GetProperty('RRULE'); if (isset($recur)) { $recur = $recur->Value(); $this_start = clone $dtstart; $rule = new RepeatRule($this_start, $recur, $is_date); $i = 0; $result_limit = 1000; while ($date = $rule->next()) { $instances[$date->UTC('Y-m-d\\TH:i:s\\Z')] = $comp; if ($i++ >= $result_limit || $date > $range_end) { break; } } if (DEBUG_EXPAND) { print "After rrule_expand"; foreach ($instances as $k => $v) { print ' : ' . $k; } print "\n"; } } $properties = $comp->GetProperties('RDATE'); if (count($properties)) { foreach ($properties as $p) { $timezone = $p->GetParameterValue('TZID'); $rdate = $p->Value(); $rdates = explode(',', $rdate); foreach ($rdates as $k => $v) { $rdate = new RepeatRuleDateTime($v, $timezone, $is_date); if ($return_floating_times) { $rdate->setAsFloat(); } $instances[$rdate->UTC('Y-m-d\\TH:i:s\\Z')] = $comp; if ($rdate > $range_end) { break; } } } if (DEBUG_EXPAND) { print "After rdate_expand"; foreach ($instances as $k => $v) { print ' : ' . $k; } print "\n"; } } } ksort($instances); $onsets = array(); $start_utc = $range_start->UTC('Y-m-d\\TH:i:s\\Z'); $end_utc = $range_end->UTC('Y-m-d\\TH:i:s\\Z'); foreach ($instances as $utc => $comp) { if ($utc > $end_utc) { if (DEBUG_EXPAND) { printf("We're done: {$utc} is out of the range.\n"); } break; } if ($utc < $start_utc) { continue; } $onsets[$utc] = array('from' => $comp->GetPValue('TZOFFSETFROM'), 'to' => $comp->GetPValue('TZOFFSETTO'), 'name' => $comp->GetPValue('TZNAME'), 'type' => $comp->GetType()); } return $onsets; }