Мне было интересно, какая максимальная длина настроек часового пояса в PHP? Я храню строку в базе данных и хотел бы сохранить длину как можно короче, но я вижу временные точки, такие как «Канада / Восток-Саскачеван», что выходит за рамки нашего текущего предела.
Если бы я мог просто получить список всех поддерживаемых строк часового пояса, я могу их отсортировать, но в настоящее время они разделены на несколько разных страниц.
linky: http://www.php.net/manual/en/timezones.php
Ответ равен 32. И вот полный PHP-код, чтобы найти это:
<?php $timezone_identifiers = DateTimeZone::listIdentifiers(); $maxlen = 0; foreach($timezone_identifiers as $id) { if(strlen($id) > $maxlen) $maxlen = strlen($id); } echo "Max Length: $maxlen"; /* Output: Max Length: 32 */ ?>
База данных Olson – доступна на ftp://ftp.iana.org/tz/releases/ или http://www.iana.org/time-zones (но см. Также http://www.twinsun.com/tz/ tz-link.htm * и http://en.wikipedia.org/wiki/Tz_database ) – источник этих имен. Документация в файле Theory включает описание того, как формируются имена зон. Это поможет вам определить, как долго могут быть имена.
Самые длинные «текущие» имена – 30 символов (Америка / Аргентина / Буэнос-Айрес, Америка / Аргентина / Рио-Галлегос, Америка / Северная_Дакота / Нью-Салем); самое длинное имя обратной совместимости – 32 символа (Америка / Аргентина / ComodRivadavia).
* Обратите внимание, что сайт TwinSun некоторое время не обновлялся и имеет некоторые устаревшие ссылки (например, предполагая, что база данных Olson доступна на ftp://ftp.elsie.nci.nih.gov – теперь она доступна из IANA ).
Из руководства :
<?php $timezone_identifiers = DateTimeZone::listIdentifiers(); for ($i=0; $i < 5; $i++) { echo "$timezone_identifiers[$i]\n"; } ?>
Каждый часовой пояс может быть сокращен до 4 символов или меньше. ( http://www.timeanddate.com/library/abbreviations/timezones/ ) Итак, возможно, вы можете просто создать статический массив полных именных часовых поясов, связывающих их с их сокращенным именем. Это позволит вам использовать и то, и другое.
$timeZone = 'Canada/East-Saskatchewan'; $tz = DateTimeZone::listAbbreviations(); echo recursiveArraySearch($tz, $timeZone); function recursiveArraySearch($haystack, $needle, $index = null) { $aIt = new RecursiveArrayIterator($haystack); $it = new RecursiveIteratorIterator($aIt); while($it->valid()) { if (((isset($index) AND ($it->key() == $index)) OR (!isset($index))) AND ($it->current() == $needle)) { return $aIt->key(); } $it->next(); } return false; }
Если вы используете MySQL с PHP, считайте, что MySQL уже хранит имена часовых поясов Olson в системной базе данных «mysql» в таблице под названием «time_zone_name» в столбце «имя». Один из вариантов – выбрать длину столбца в соответствии с длиной, используемой MySQL. В MySQL 5.7 длина имени часового пояса составляет 64 символа. Чтобы определить длину, используемую при установке MySQL, следуйте приведенному ниже примеру:
mysql> use mysql Database changed mysql> describe time_zone_name; +--------------+------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------------+------------------+------+-----+---------+-------+ | Name | char(64) | NO | PRI | NULL | | | Time_zone_id | int(10) unsigned | NO | | NULL | | +--------------+------------------+------+-----+---------+-------+ 2 rows in set (0.01 sec)