PHP: список временных зон для сайта
Часто на сайте нужна форма для выбора часового пояса и в инете полно списков или массивов, составленных из названий временных зон PHP.
Но города и целые страны имеют свойство "переезжать" в другие часовые пояса, так что, взяв готовый и составленный кем-то статический список, вы рискуете получить устаревшую информацию.
Лучше получить список временных зон из самой среды выполнения, ниже показан маленький класс, который это делает. Метод get_array
может вернуть массив временных зон,
ключами в котором будут их "официальные" названия вроде 'Europe/Moscow
', а значениями - вложенные массивы по два элемента (с ключом 'timezone
' - описание зоны, с ключом 'offset
' - разница с Гринвичем в секундах).
Метод get_html_list
вернёт готовый выпадающий HTML-список временных зон, аргументом $name
в него можно передать наименование для списка (атрибуты HTML name
и id
), а аргументом $selected
- временную зону, выбранную по умолчанию.
Вот полный листинг класса с примером вызова, нужна версия PHP не ниже 5.2.0 (updated to 8.X).
<?php class TimeZoneList { private $timezone_identifiers; private $error; public function __construct () { $this->error = ''; $needver = '5.2.0'; if (version_compare(PHP_VERSION, $needver, '<=')) { $this->error = 'Класс TimeZoneList требует PHP версии не ниже '.$needver.'. Ваша версия: '.PHP_VERSION; return; } $this->timezone_identifiers = DateTimeZone::listIdentifiers(); } public function get_array () { $timezones = array (); if (!empty($this->error)) return array (0 => $this->error); $phpTime = Date("Y-m-d H:i:s"); foreach ($this->timezone_identifiers as $key=>$value) { if (preg_match('/^(Europe|America|Asia|Antartica|Arctic|Atlantic|Indian|Pacific)\//', $value)) { $timezone = new DateTimeZone ($value); $offset = $timezone->getOffset(new DateTime($phpTime)); $offsetHours = abs($offset)/3600; $offsetString = ($offset < 0 ? '-' : '+'); if (abs($offsetHours)==1) $label = 'час'; else if (abs($offsetHours)>1 and abs($offsetHours)<5) $label = 'часа'; else $label = 'часов'; $timezones[$value] = array ( 'timezone' => $value.' ('.$offsetString.$offsetHours.' '.$label.')', 'offset' => $offset ); } } uasort ($timezones, function ($a, $b) { if ($a['offset'] == $b['offset']) return 0; else if ($a['offset'] < $b['offset']) return -1; return 1; }); return $timezones; } public function get_html_list ($name='timeZoneList',$selected='Europe/Moscow') { $timezones = $this->get_array(); $content = '<select size="1" name="'.$name.'" id="'.$name.'">'."\n"; foreach ($timezones as $key => $value) { $content .= '<option value="'.$key.'" id="tz_'.$key.'"'.($key==$selected?' selected':''). '>'.$value['timezone']."\n"; } $content .= '</select>'; return $content; } } ?>
вид раскрытого списка при выполнении скрипта на локалхосте, скриншот
P. S. По просьбе трудящихся привожу пример использования этого класса, проверенный на локалхосте XAMPP с текущей версий PHP8.
Код класса (без примера вызова в четырёх последних строках кода) поместим в файл TimeZoneList.php
:
<?php class TimeZoneList { //... } ?>
В этой же папке создадим файл .php
с таким содержимым:
<?php require_once 'TimeZoneList.php'; $tList = new TimeZoneList (); $default_value = 'Asia/Novosibirsk'; if (isset($_POST['action'])) { $zone = trim($_POST['myList']); $res = date_default_timezone_set ($zone); if ($res === false) { echo '<p>Ошибка установки временной зоны "'.$zone.'"</p>'; } else { $default_value = $zone; } echo '<p>Текущие дата и время: '.date ('d.m.Y, H:i:s').'</p>'; } echo '<form method="post">'."\n". $tList->get_html_list('myList',$default_value)."\n". '<input name="action" type="submit"></form>'."\n"; ?>
Теперь после выбора временной зоны она запоминается в списке плюс показываются текущие дата и время в выбранном часовом поясе.
12.12.2018, 17:25 [3018 просмотров]