Блог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');
?>
вид раскрытого списка при выполнении скрипта на локалхосте, скриншот
вид раскрытого списка при выполнении скрипта на локалхосте, скриншот

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

12.12.2018, 17:25; рейтинг: 641