• Модуль: dav
  • Путь к файлу: ~/bitrix/modules/dav/classes/general/tzgen.php
  • Класс: TZGen
  • Вызов: TZGen::toVTimeZone
static function toVTimeZone($tzid, $from = NULL, $until = NULL)
{
	$vTimeZone  = 'BEGIN:VTIMEZONE' . self::EOL;
	$vTimeZone .= 'TZID:' . $tzid . self::EOL;

	$from = $from ?: date_create('now', new DateTimeZone('UTC'));

	$timezone = new DateTimeZone($tzid);

	$transitions = TZConvTransition::getTransitions($timezone, $from, $until);

	if ($transitions->count() > 0)
	{
		$splitedTransitions = array(
		'DAYLIGHT' => $transitions->filter('isdst', TRUE),
		'STANDART' => $transitions->filter('isdst', FALSE),
		);

		foreach ($splitedTransitions as $transitions)
		{
			if (count ($transitions) == 0)
				continue;

			$useRrule = TRUE;
			$transitionRule = TZConvTransitionRule::createFromTransition($transitions->getFirst());
			foreach ($transitions as $transition)
			{
				$expectedTransitionDate = $transitionRule->computeTransitionDate(mb_substr($transition['time'], 0, 4));
				if ($expectedTransitionDate->format(DateTime::ISO8601) != $transition['time'])
				{
					$useRrule = FALSE;
					break;
				}
			}

			if ($useRrule)
			{
				$backTransitions = TZConvTransition::getTransitions($timezone, NULL, $transitionRule->from)
				->filter('isdst', $transitionRule->isdst)
				->sort('time', 'DESC');

				foreach ($backTransitions as $backTransition)
				{
					$expectedTransitionDate = $transitionRule->computeTransitionDate(mb_substr($backTransition['time'], 0, 4));
					if ($expectedTransitionDate->format(DateTime::ISO8601) != $backTransition['time'])
					{
						break;
					}

					$transitionRule->from = $expectedTransitionDate;
				}
			}

			else
			{
				$transitionRule = TZConvTransitionRule::createFromTransition($transitions->getFirst(), FALSE);
				$transitionRule->clearTransitionDates();
				foreach ($transitions as $transition)
				{
				//	$transitionRule->addTransitionDate(new DateTime($transition['time'], new DateTimeZone('UTC')));
				}
			}

			$offsetFromDate = clone $transitionRule->from;
			$offsetFromDate->setTimezone($timezone);
			$offsetFromDate->modify("-1 day");
			$offsetFrom = $offsetFromDate->getOffset();

			$vTimeZone .= self::transitionRuleToVTransitionRule($transitionRule, $offsetFrom);
		}
	}
	else
	{
		$transitions = TZConvTransition::getTransitions($timezone, 1, null);

		if ($transitions->count() > 0)
		{
			$transitionRule = TZConvTransitionRule::createFromTransition($transitions->getLast(), FALSE);
			$transitionRule->clearTransitionDates();

			$offsetFromDate = clone $transitionRule->from;
			$offsetFromDate->setTimezone($timezone);
			$offsetFrom = $offsetFromDate->getOffset();

			$vTimeZone .= self::transitionRuleToVTransitionRule($transitionRule, $offsetFrom);
		}

	}

	$vTimeZone .= 'END:VTIMEZONE' . self::EOL;

	return $vTimeZone;
}