- Модуль: bizproc
- Путь к файлу: ~/bitrix/modules/bizproc/lib/basetype/date.php
- Класс: BitrixBizprocBaseTypeDate
- Вызов: Date::getZones
static function getZones()
{
$serverOffset = (new DateTime())->getOffset();
$timezones = [];
$exclude = ["Etc/", "GMT", "UTC", "UCT", "HST", "PST", "MST", "CST", "EST", "CET", "MET", "WET", "EET", "PRC", "ROC", "ROK", "W-SU"];
foreach (DateTimeZone::listIdentifiers() as $tz)
{
foreach ($exclude as $ex)
if (mb_strpos($tz, $ex) === 0)
continue 2;
try
{
$dateTimeZone = new DateTimeZone($tz);
$timezones[$tz] = ['timezone_id' => $tz, 'offset' => $dateTimeZone->getOffset(new DateTime("now", $dateTimeZone))];
} catch (Exception $e)
{
}
}
uasort($timezones, function ($a, $b)
{
if ($a['offset'] == $b['offset'])
return strcmp($a['timezone_id'], $b['timezone_id']);
return ($a['offset'] < $b['offset'] ? -1 : 1);
});
$result = [
['value' => '', 'text' => Loc::getMessage('BPDT_DATE_SERVER_TZ'), 'offset' => 0],
['value' => 'current', 'text' => Loc::getMessage('BPDT_DATE_CURRENT_TZ'), 'offset' => 'current']
];
foreach ($timezones as $z)
{
$result[] = [
'value' => $z['timezone_id'],
'text' => '(UTC'.($z['offset'] <> 0 ? ' '.($z['offset'] < 0 ? '-' : '+').sprintf("%02d", ($h = floor(abs($z['offset']) / 3600))).':'.sprintf("%02d", abs($z['offset']) / 60 - $h * 60) : '').') '.$z['timezone_id'],
'offset' => $z['offset'] - $serverOffset
];
}
return $result;
}