function testGetDateTimeCached() { $tz = new \DateTimeZone('Europe/Amsterdam'); $dt = new \DateTime('1985-07-04 01:30:00', $tz); $dt->setTimeZone($tz); $elem = new DateTime('DTSTART'); $elem->setDateTime($dt); $this->assertEquals($elem->getDateTime(), $dt); }
/** * Parses the internal data structure to figure out what the current date * and time is. * * The returned array contains two elements: * 1. A 'DateType' constant (as defined on this class), or null. * 2. A DateTime object (or null) * * @param string|null $propertyValue The string to parse (yymmdd or * ymmddThhmmss, etc..) * @param \Sabre\VObject\Property|null $property The instance of the * property we're parsing. * @return array */ public static function parseData($propertyValue, VObject\Property $property = null) { if (is_null($propertyValue)) { return array(null, null); } $date = '(?P<year>[1-2][0-9]{3})(?P<month>[0-1][0-9])(?P<date>[0-3][0-9])'; $time = '(?P<hour>[0-2][0-9])(?P<minute>[0-5][0-9])(?P<second>[0-5][0-9])'; $regex = "/^{$date}(T{$time}(?P<isutc>Z)?)?\$/"; if (!preg_match($regex, $propertyValue, $matches)) { throw new \InvalidArgumentException($propertyValue . ' is not a valid \\DateTime or Date string'); } if (!isset($matches['hour'])) { // Date-only return array(self::DATE, new \DateTime($matches['year'] . '-' . $matches['month'] . '-' . $matches['date'] . ' 00:00:00', new \DateTimeZone('UTC'))); } $dateStr = $matches['year'] . '-' . $matches['month'] . '-' . $matches['date'] . ' ' . $matches['hour'] . ':' . $matches['minute'] . ':' . $matches['second']; if (isset($matches['isutc'])) { $dt = new \DateTime($dateStr, new \DateTimeZone('UTC')); $dt->setTimeZone(new \DateTimeZone('UTC')); return array(self::UTC, $dt); } // Finding the timezone. $tzid = $property['TZID']; if (!$tzid) { // This was a floating time string. This implies we use the // timezone from date_default_timezone_set / date.timezone ini // setting. return array(self::LOCAL, new \DateTime($dateStr)); } // To look up the timezone, we must first find the VCALENDAR component. $root = $property; while ($root->parent) { $root = $root->parent; } if ($root->name === 'VCALENDAR') { $tz = VObject\TimeZoneUtil::getTimeZone((string) $tzid, $root); } else { $tz = VObject\TimeZoneUtil::getTimeZone((string) $tzid); } $dt = new \DateTime($dateStr, $tz); $dt->setTimeZone($tz); return array(self::LOCALTZ, $dt); }