我在想什么PHP的时区设置的最大长度?我将字符串存储在数据库中,并希望保持尽可能短的时间,但是我看到“加拿大/东萨斯喀彻温省”等时区,这超出了我们目前的限制。PHP TZ设置长度
如果我只能得到所有支持的时区字符串的列表,我可以对它们进行排序,但它们目前被分成几个不同的页面。
linky:http://www.php.net/manual/en/timezones.php
我在想什么PHP的时区设置的最大长度?我将字符串存储在数据库中,并希望保持尽可能短的时间,但是我看到“加拿大/东萨斯喀彻温省”等时区,这超出了我们目前的限制。PHP TZ设置长度
如果我只能得到所有支持的时区字符串的列表,我可以对它们进行排序,但它们目前被分成几个不同的页面。
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
*/
?>
每个时区可以缩写成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;
}
不唯一。例如,请注意,有三个不同的区域称为“EST”。不仅如此,而且这两种描述符甚至不描述相同的事物。例如,奥尔森地区的“America/Denver”在冬季对应于三个字母的名称“MST”,在夏季对应于“MDT”,而“America/Phoenix”全年对应于“MST”。至少你需要一个POSIX区域描述符,如'MST7MDT,M3.2.0,M11.1.0',但即使这样也包含更少的信息:) – hobbs 2010-08-13 14:03:40
好的结果。我忘了考虑夏令时。我将着手研究如何适应它。 – 2010-08-13 14:19:36
从manual:
<?php
$timezone_identifiers = DateTimeZone::listIdentifiers();
for ($i=0; $i < 5; $i++) {
echo "$timezone_identifiers[$i]\n";
}
?>
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) - 是th这些名字的来源。理论文件中的文档包含了如何形成区域名称的描述。这将帮助您确定名称的长度。
最长的“当前”名称是30个字符(America/Argentina/Buenos_Aires, America/Argentina/Rio_Gallegos,America/North_Dakota/New_Salem);最长的“向后兼容性”名称是32个字符(America/Argentina/ComodRivadavia)。
*注意,TwinSun网站一直没有更新了一段时间,有一些过时的链接(如提示奥尔森数据库可从ftp://ftp.elsie.nci.nih.gov - 现在可从IANA代替)。
如果您使用的MySQL与PHP,考虑MySQL已经存储在“mysql”系统数据库中的名为“time_zone_name”,名为“名称”列中的Olson时区名称。一种选择是选择列的长度以匹配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)
感谢您成为一个欢迎社区。 – karlw 2010-08-14 12:05:13