- Модуль: 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;
}