public static function _strdate2date($datetime, $parno = FALSE, $wtz = null) { // save original input string to return it later $unparseddatetime = $datetime; $datetime = (string) trim($datetime); $tz = null; $offset = 0; $tzSts = FALSE; $len = strlen($datetime); if ('Z' == substr($datetime, -1)) { $tz = 'Z'; $datetime = trim(substr($datetime, 0, $len - 1)); $tzSts = TRUE; $len = 88; } if (ICalUtilityFunctions::_isOffset(substr($datetime, -5, 5))) { // [+/-]NNNN offset $tz = substr($datetime, -5, 5); $datetime = trim(substr($datetime, 0, $len - 5)); $len = strlen($datetime); } elseif (ICalUtilityFunctions::_isOffset(substr($datetime, -7, 7))) { // [+/-]NNNNNN offset $tz = substr($datetime, -7, 7); $datetime = trim(substr($datetime, 0, $len - 7)); $len = strlen($datetime); } elseif (empty($wtz) && ctype_digit(substr($datetime, 0, 4)) && ctype_digit(substr($datetime, -2, 2)) && ICalUtilityFunctions::_strDate2arr($datetime)) { $output = $datetime; if (!empty($tz)) { $output['tz'] = 'Z'; } $output['unparsedtext'] = $unparseddatetime; return $output; } else { $cx = $tx = 0; // find any trailing timezone or offset for ($cx = -1; $cx > 9 - $len; $cx--) { $char = substr($datetime, $cx, 1); if (' ' == $char || ctype_digit($char)) { break; } else { $tx--; } // tz length counter } if (0 > $tx) { // if any $tz = substr($datetime, $tx); $datetime = trim(substr($datetime, 0, $len + $tx)); $len = strlen($datetime); } if (17 <= $len || ctype_digit(substr($datetime, 0, 8)) && 'T' == substr($datetime, 8, 1) && ctype_digit(substr($datetime, -6, 6)) || ctype_digit(substr($datetime, 0, 14))) { $len = 88; $tzSts = TRUE; } else { $tz = null; } // no tz for Y-m-d dates } if (empty($tz) && !empty($wtz)) { $tz = $wtz; } if (17 >= $len) { // any Y-m-d textual date $tz = null; } if (!empty($tz) && 17 < $len) { // tz set AND long textual datetime if ('Z' != $tz && ICalUtilityFunctions::_isOffset($tz)) { $offset = (string) ICalUtilityFunctions::_tz2offset($tz) * -1; $tz = 'UTC'; $tzSts = TRUE; } elseif (!empty($wtz)) { $tzSts = TRUE; } $tz = trim($tz); if ('Z' == $tz || 'GMT' == strtoupper($tz)) { $tz = 'UTC'; } if (0 < substr_count($datetime, '-')) { $datetime = str_replace('-', '/', $datetime); } try { $d = new \DateTime($datetime, new \DateTimeZone($tz)); if (0 != $offset) { // adjust for offset $d->modify($offset . ' seconds'); } $datestring = $d->format('Y-m-d-H-i-s'); unset($d); } catch (Exception $e) { $datestring = date('Y-m-d-H-i-s', strtotime($datetime)); } } else { $datestring = date('Y-m-d-H-i-s', strtotime($datetime)); } // echo "<tr><td> <td colspan='3'>_strdate2date input=$datetime, tz=$tz, offset=$offset, wtz=$wtz, len=$len, prepDate=$datestring\n"; if ('UTC' == $tz) { $tz = 'Z'; } $d = explode('-', $datestring); $output = array('year' => $d[0], 'month' => $d[1], 'day' => $d[2]); if (FALSE !== $parno && 3 != $parno || FALSE === $parno && 'Z' == $tz || FALSE === $parno && 'Z' != $tz && 0 != $d[3] + $d[4] + $d[5] && 17 < $len) { // !parno and !UTC and 0 != hour+min+sec and long input text $output['hour'] = $d[3]; $output['min'] = $d[4]; $output['sec'] = $d[5]; if (($tzSts || 7 == $parno) && !empty($tz)) { $output['tz'] = $tz; } } // return original string in the array in case strtotime failed to make sense of it $output['unparsedtext'] = $unparseddatetime; return $output; }
/** * set calendar component property rdate * * @author Kjell-Inge Gustafsson, kigkonsult <*****@*****.**> * @since 2.14.1 - 2012-10-04 * @param array $rdates * @param array $params, optional * @param integer $index, optional * @return bool */ function setRdate($rdates, $params = FALSE, $index = FALSE) { if (empty($rdates)) { if ($this->getConfig('allowEmpty')) { ICalUtilityFunctions::_setMval($this->rdate, null, $params, FALSE, $index); return TRUE; } else { return FALSE; } } $input = array('params' => ICalUtilityFunctions::_setParams($params, array('VALUE' => 'DATE-TIME'))); if (in_array($this->objName, array('VTimeZone', 'standard', 'daylight'))) { unset($input['params']['TZID']); $input['params']['VALUE'] = 'DATE-TIME'; } $zArr = array('GMT', 'UTC', 'Z'); $toZ = isset($params['TZID']) && in_array(strtoupper($params['TZID']), $zArr) ? TRUE : FALSE; /* check if PERIOD, if not set */ if ((!isset($input['params']['VALUE']) || !in_array($input['params']['VALUE'], array('DATE', 'PERIOD'))) && isset($rdates[0]) && is_array($rdates[0]) && 2 == count($rdates[0]) && isset($rdates[0][0]) && isset($rdates[0][1]) && !isset($rdates[0]['timestamp']) && (is_array($rdates[0][0]) && (isset($rdates[0][0]['timestamp']) || ICalUtilityFunctions::_isArrayDate($rdates[0][0])) || is_string($rdates[0][0]) && 8 <= strlen(trim($rdates[0][0]))) && (is_array($rdates[0][1]) || is_string($rdates[0][1]) && 3 <= strlen(trim($rdates[0][1])))) { $input['params']['VALUE'] = 'PERIOD'; } /* check 1:st date, upd. $parno (opt) and save ev. timezone * */ $date = reset($rdates); if (isset($input['params']['VALUE']) && 'PERIOD' == $input['params']['VALUE']) { // PERIOD $date = reset($date); } ICalUtilityFunctions::_chkdatecfg($date, $parno, $input['params']); ICalUtilityFunctions::_existRem($input['params'], 'VALUE', 'DATE-TIME'); // remove default foreach ($rdates as $rpix => $theRdate) { $inputa = null; ICalUtilityFunctions::_strDate2arr($theRdate); if (is_array($theRdate)) { if (isset($input['params']['VALUE']) && 'PERIOD' == $input['params']['VALUE']) { // PERIOD foreach ($theRdate as $rix => $rPeriod) { ICalUtilityFunctions::_strDate2arr($theRdate); if (is_array($rPeriod)) { if (ICalUtilityFunctions::_isArrayTimestampDate($rPeriod)) { // timestamp if (isset($rPeriod['tz']) && !ICalUtilityFunctions::_isOffset($rPeriod['tz'])) { if (isset($input['params']['TZID'])) { $rPeriod['tz'] = $input['params']['TZID']; } else { $input['params']['TZID'] = $rPeriod['tz']; } } $inputab = ICalUtilityFunctions::_timestamp2date($rPeriod, $parno); } elseif (ICalUtilityFunctions::_isArrayDate($rPeriod)) { $d = 3 < count($rPeriod) ? ICalUtilityFunctions::_chkDateArr($rPeriod, $parno) : ICalUtilityFunctions::_chkDateArr($rPeriod, 6); if (isset($d['tz']) && 'Z' != $d['tz'] && ICalUtilityFunctions::_isOffset($d['tz'])) { $strdate = sprintf('%04d-%02d-%02d %02d:%02d:%02d %s', $d['year'], $d['month'], $d['day'], $d['hour'], $d['min'], $d['sec'], $d['tz']); $inputab = ICalUtilityFunctions::_strdate2date($strdate, 7); unset($inputab['unparsedtext']); } else { $inputab = $d; } } elseif (1 == count($rPeriod) && 8 <= strlen(reset($rPeriod))) { // text-date $inputab = ICalUtilityFunctions::_strdate2date(reset($rPeriod), $parno); unset($inputab['unparsedtext']); } else { // array format duration $inputab = ICalUtilityFunctions::_duration2arr($rPeriod); } } elseif (3 <= strlen(trim($rPeriod)) && in_array($rPeriod[0], array('P', '+', '-'))) { if ('P' != $rPeriod[0]) { $rPeriod = substr($rPeriod, 1); } $inputab = ICalUtilityFunctions::_durationStr2arr($rPeriod); } elseif (8 <= strlen(trim($rPeriod))) { // text date ex. 2006-08-03 10:12:18 $inputab = ICalUtilityFunctions::_strdate2date($rPeriod, $parno); unset($inputab['unparsedtext']); } if (0 == $rpix && 0 == $rix) { if (isset($inputab['tz']) && in_array(strtoupper($inputab['tz']), $zArr)) { $inputab['tz'] = 'Z'; $toZ = TRUE; } } else { if (isset($inputa[0]['tz']) && 'Z' == $inputa[0]['tz'] && isset($inputab['year'])) { $inputab['tz'] = 'Z'; } else { unset($inputab['tz']); } } if ($toZ && isset($inputab['year'])) { $inputab['tz'] = 'Z'; } $inputa[] = $inputab; } } elseif (ICalUtilityFunctions::_isArrayTimestampDate($theRdate)) { // timestamp if (isset($theRdate['tz']) && !ICalUtilityFunctions::_isOffset($theRdate['tz'])) { if (isset($input['params']['TZID'])) { $theRdate['tz'] = $input['params']['TZID']; } else { $input['params']['TZID'] = $theRdate['tz']; } } $inputa = ICalUtilityFunctions::_timestamp2date($theRdate, $parno); } else { // date[-time] $inputa = ICalUtilityFunctions::_chkDateArr($theRdate, $parno); if (isset($inputa['tz']) && 'Z' != $inputa['tz'] && ICalUtilityFunctions::_isOffset($inputa['tz'])) { $strdate = sprintf('%04d-%02d-%02d %02d:%02d:%02d %s', $inputa['year'], $inputa['month'], $inputa['day'], $inputa['hour'], $inputa['min'], $inputa['sec'], $inputa['tz']); $inputa = ICalUtilityFunctions::_strdate2date($strdate, 7); unset($inputa['unparsedtext']); } } } elseif (8 <= strlen(trim($theRdate))) { // text date ex. 2006-08-03 10:12:18 $inputa = ICalUtilityFunctions::_strdate2date($theRdate, $parno); unset($inputa['unparsedtext']); if ($toZ) { $inputa['tz'] = 'Z'; } } if (!isset($input['params']['VALUE']) || 'PERIOD' != $input['params']['VALUE']) { // no PERIOD if (0 == $rpix && !$toZ) { $toZ = isset($inputa['tz']) && in_array(strtoupper($inputa['tz']), $zArr) ? TRUE : FALSE; } if ($toZ) { $inputa['tz'] = 'Z'; } if (3 == $parno) { unset($inputa['hour'], $inputa['min'], $inputa['sec'], $inputa['tz']); } elseif (isset($inputa['tz'])) { $inputa['tz'] = (string) $inputa['tz']; } if (isset($input['params']['TZID']) || isset($input['value'][0]) && !isset($input['value'][0]['tz'])) { if (!$toZ) { unset($inputa['tz']); } } } $input['value'][] = $inputa; } if (3 == $parno) { $input['params']['VALUE'] = 'DATE'; unset($input['params']['TZID']); } if ($toZ) { unset($input['params']['TZID']); } ICalUtilityFunctions::_setMval($this->rdate, $input['value'], $input['params'], FALSE, $index); return TRUE; }