БлогNot. PHP: список временных зон для сайта

PHP: список временных зон для сайта

Часто на сайте нужна форма для выбора часового пояса и в инете полно списков или массивов, составленных из названий временных зон PHP.

Но города и целые страны имеют свойство "переезжать" в другие часовые пояса, так что, взяв готовый и составленный кем-то статический список, вы рискуете получить устаревшую информацию.

Лучше получить список временных зон из самой среды выполнения, ниже показан маленький класс, который это делает. Метод get_array может вернуть массив временных зон, ключами в котором будут их "официальные" названия вроде 'Europe/Moscow', а значениями - вложенные массивы по два элемента (с ключом 'timezone' - описание зоны, с ключом 'offset' - разница с Гринвичем в секундах).

Метод get_html_list вернёт готовый выпадающий HTML-список временных зон, аргументом $name в него можно передать наименование для списка (атрибуты HTML name и id), а аргументом $selected - временную зону, выбранную по умолчанию.

Вот полный листинг класса с примером вызова, нужна версия PHP не ниже 5.2.0.

<?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) {
    return $a['offset'] != $b['offset'] ? $b['offset'] < $a['offset'] : $b['timezone'] < $a['timezone'];
   });

   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;
  }
 }

 $tList = new TimeZoneList ();
 $tZones = $tList->get_array();
 //print_r ($tZones);
 echo $tList->get_html_list('myList','Asia/Novosibirsk');
?>
вид раскрытого списка при выполнении скрипта на локалхосте, скриншот
вид раскрытого списка при выполнении скрипта на локалхосте, скриншот

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 [1544 просмотра]


теги: список время php