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