2010-08-13 55 views
6

我在想什么PHP的时区设置的最大长度?我将字符串存储在数据库中,并希望保持尽可能短的时间,但是我看到“加拿大/东萨斯喀彻温省”等时区,这超出了我们目前的限制。PHP TZ设置长度

如果我只能得到所有支持的时区字符串的列表,我可以对它们进行排序,但它们目前被分成几个不同的页面。

linky:http://www.php.net/manual/en/timezones.php

+2

感谢您成为一个欢迎社区。 – karlw 2010-08-14 12:05:13

回答

12

答案是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 

*/ 
?> 
+3

重要的是要注意,将宽度设置为32的OP将是一个巨大的错误。它应该设置得更高 - 以防万一。 – Buggabill 2010-08-13 13:59:51

+8

我认为答案是42 - 是不是总是42? – 2010-08-13 14:38:18

+0

@Jonathan - 我打算说这个,但不希望OP使用它...:-) – Buggabill 2010-08-13 16:56:32

0

每个时区可以缩写成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; 
} 
+2

不唯一。例如,请注意,有三个不同的区域称为“EST”。不仅如此,而且这两种描述符甚至不描述相同的事物。例如,奥尔森地区的“America/Denver”在冬季对应于三个字母的名称“MST”,在夏季对应于“MDT”,而“America/Phoenix”全年对应于“MST”。至少你需要一个POSIX区域描述符,如'MST7MDT,M3.2.0,M11.1.0',但即使这样也包含更少的信息:) – hobbs 2010-08-13 14:03:40

+0

好的结果。我忘了考虑夏令时。我将着手研究如何适应它。 – 2010-08-13 14:19:36

1

manual

<?php 
$timezone_identifiers = DateTimeZone::listIdentifiers(); 
for ($i=0; $i < 5; $i++) { 
    echo "$timezone_identifiers[$i]\n"; 
} 
?> 
8

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代替)。

0

如果您使用的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)