Horde_Icalendar_Vtimezone::parseChild PHP Method

parseChild() public method

Returns an array with the exact time of the time change as well as the 'from' and 'to' offsets around the change. Time is arbitrarily based on UTC for comparison.
public parseChild ( Horde_Icalendar_Standard | Horde_Icalendar_Daylight $child, integer $year ) : array
$child Horde_Icalendar_Standard | Horde_Icalendar_Daylight A timezone component.
$year integer The latest year we are interested in.
return array A list of hashes with "time", "from", and "to" elements.
    public function parseChild($child, $year)
    {
        $result['time'] = $result['end'] = 0;
        try {
            $t = $child->getAttribute('TZOFFSETFROM');
        } catch (Horde_Icalendar_Exception $e) {
            return array();
        }
        $result['from'] = ($t['hour'] * 60 * 60 + $t['minute'] * 60) * ($t['ahead'] ? 1 : -1);
        try {
            $t = $child->getAttribute('TZOFFSETTO');
        } catch (Horde_Icalendar_Exception $e) {
            return array();
        }
        $result['to'] = ($t['hour'] * 60 * 60 + $t['minute'] * 60) * ($t['ahead'] ? 1 : -1);
        try {
            $start = $child->getAttribute('DTSTART');
        } catch (Horde_Icalendar_Exception $e) {
            return array();
        }
        if (!is_int($start)) {
            return array();
        }
        $start = getdate($start);
        if ($start['year'] > $year) {
            return array();
        }
        $results = array();
        try {
            $rdates = $child->getAttributeValues('RDATE');
            foreach ($rdates as $rdate) {
                if ($rdate['year'] == $year || $rdate['year'] == $year - 1) {
                    $result['time'] = $result['end'] = gmmktime($start['hours'], $start['minutes'], $start['seconds'], $rdate['month'], $rdate['mday'], $rdate['year']);
                    $results[] = $result;
                }
            }
        } catch (Horde_Icalendar_Exception $e) {
        }
        try {
            $rrules = $child->getAttribute('RRULE');
        } catch (Horde_Icalendar_Exception $e) {
            if (!$results) {
                $result['time'] = $result['end'] = $start[0];
                $results[] = $result;
            }
            return $results;
        }
        $rrules = explode(';', $rrules);
        foreach ($rrules as $rrule) {
            $t = explode('=', $rrule);
            switch ($t[0]) {
                case 'FREQ':
                    if ($t[1] != 'YEARLY') {
                        return array();
                    }
                    break;
                case 'INTERVAL':
                    if ($t[1] != '1') {
                        return array();
                    }
                    break;
                case 'BYMONTH':
                    $month = intval($t[1]);
                    break;
                case 'BYDAY':
                    $len = strspn($t[1], '1234567890-+');
                    if ($len == 0) {
                        return array();
                    }
                    $weekday = substr($t[1], $len);
                    $weekdays = array('SU' => 0, 'MO' => 1, 'TU' => 2, 'WE' => 3, 'TH' => 4, 'FR' => 5, 'SA' => 6);
                    $weekday = $weekdays[$weekday];
                    $which = intval(substr($t[1], 0, $len));
                    break;
                case 'UNTIL':
                    $result['end'] = intval(substr($t[1], 0, 4));
                    break;
            }
        }
        if (empty($month) || !isset($weekday)) {
            return array();
        }
        // Get the timestamp for the first day of $month.
        $when = gmmktime($start['hours'], $start['minutes'], $start['seconds'], $month, 1, $year);
        // Get the day of the week for the first day of $month.
        $first_of_month_weekday = intval(gmstrftime('%w', $when));
        // Go to the first $weekday before first day of $month.
        if ($weekday >= $first_of_month_weekday) {
            $weekday -= 7;
        }
        $when -= ($first_of_month_weekday - $weekday) * 60 * 60 * 24;
        // If going backwards go to the first $weekday after last day
        // of $month.
        if ($which < 0) {
            do {
                $when += 60 * 60 * 24 * 7;
            } while (intval(gmstrftime('%m', $when)) == $month);
        }
        // Calculate $weekday number $which.
        $when += $which * 60 * 60 * 24 * 7;
        $result['time'] = $when;
        $results[] = $result;
        return $results;
    }
Horde_Icalendar_Vtimezone