什么是“标准”时区缩写?
我正在使用此下拉列表按偏移量从UTC存储时区:
<select id="timezone" name="timezone" >
<option value="-12">[UTC - 12] Baker Island Time</option>
<option value="-11">[UTC - 11] Niue Time, Samoa Standard Time</option>
<option value="-10">[UTC - 10] Hawaii-Aleutian Standard Time, Cook Island Time</option>
<option value="-9.5">[UTC - 9:30] Marquesas Islands Time</option>
<option value="-9">[UTC - 9] Alaska Standard Time, Gambier Island Time</option>
<option value="-8">[UTC - 8] Pacific Standard Time</option>
<option value="-7">[UTC - 7] Mountain Standard Time</option>
<option value="-6">[UTC - 6] Central Standard Time</option>
<option value="-5">[UTC - 5] Eastern Standard Time</option>
<option value="-4.5">[UTC - 4:30] Venezuelan Standard Time</option>
<option value="-4">[UTC - 4] Atlantic Standard Time</option>
<option value="-3.5">[UTC - 3:30] Newfoundland Standard Time</option>
<option value="-3">[UTC - 3] Amazon Standard Time, Central Greenland Time</option>
<option value="-2">[UTC - 2] Fernando de Noronha Time, South Georgia & the South Sandwich Islands Time</option>
<option value="-1">[UTC - 1] Azores Standard Time, Cape Verde Time, Eastern Greenland Time</option>
<option value="0">[UTC] Western European Time, Greenwich Mean Time</option>
<option value="1">[UTC + 1] Central European Time, West African Time</option>
<option value="2">[UTC + 2] Eastern European Time, Central African Time</option>
<option value="3">[UTC + 3] Moscow Standard Time, Eastern African Time</option>
<option value="3.5">[UTC + 3:30] Iran Standard Time</option>
<option value="4">[UTC + 4] Gulf Standard Time, Samara Standard Time</option>
<option value="4.5">[UTC + 4:30] Afghanistan Time</option>
<option value="5">[UTC + 5] Pakistan Standard Time, Yekaterinburg Standard Time</option>
<option value="5.5">[UTC + 5:30] Indian Standard Time, Sri Lanka Time</option>
<option value="5.75">[UTC + 5:45] Nepal Time</option>
<option value="6">[UTC + 6] Bangladesh Time, Bhutan Time, Novosibirsk Standard Time</option>
<option value="6.5">[UTC + 6:30] Cocos Islands Time, Myanmar Time</option>
<option value="7">[UTC + 7] Indochina Time, Krasnoyarsk Standard Time</option>
<option value="8">[UTC + 8] Chinese Standard Time, Australian Western Standard Time, Irkutsk Standard Time</option>
<option value="8.75">[UTC + 8:45] Southeastern Western Australia Standard Time</option>
<option value="9">[UTC + 9] Japan Standard Time, Korea Standard Time, Chita Standard Time</option>
<option value="9.5">[UTC + 9:30] Australian Central Standard Time</option>
<option value="10">[UTC + 10] Australian Eastern Standard Time, Vladivostok Standard Time</option>
<option value="10.5">[UTC + 10:30] Lord Howe Standard Time</option>
<option value="11">[UTC + 11] Solomon Island Time, Magadan Standard Time</option>
<option value="11.5">[UTC + 11:30] Norfolk Island Time</option>
<option value="12">[UTC + 12] New Zealand Time, Fiji Time, Kamchatka Standard Time</option>
<option value="12.75">[UTC + 12:45] Chatham Islands Time</option>
<option value="13">[UTC + 13] Tonga Time, Phoenix Islands Time</option>
<option value="14">[UTC + 14] Line Island Time</option>
使用PHP,我真的没有最简单的选项将它们转换为时区缩写,我唯一选择以编程方式执行它的方法是对约400个时区缩写进行排序。 有没有人知道与每个时区的下拉菜单一致的列表,以及夏令时正在进行时的情况? (我想我需要手动定义这两个列表)
编辑:将这个列表解析为每个时区的单个缩写,但它们并不是“流行”的。
我的新名单
[-12] => kwat
[-11] => bst
[-10] => ahst
[-9.5] => ckhst
[-9] => ahdt
[-8] => akdt
[-7] => east
[-6] => cst
[-5] => act
[-4.5] => ant
[-4] => acst
[-3.5] => negt
[-3] => adt
[-2] => addt
[-1] => azost
[-0] => azomt
[1] => bst
[2] => bdst
[3] => amt
[3.5] => irst
[4] => adt
[4.5] => aft
[5] => aktt
[5.5] => ist
[5.75] => npt
[6] => aktst
[6.5] => burt
[7] => almst
[8] => bnt
[8.75] => cwst
[9] => cdt
[9.5] => cast
[10] => chost
[10.5] => cst
[11] => anat
[11.5] => lhst
[12] => anast
[12.75] => chast
[13] => anast
[14] => anast
码:
$abbr = DateTimeZone::listAbbreviations();
$offsets=array('-12','-11','-10','-9.5','-9','-8','-7','-6',
'-5','-4.5','-4','-3.5','-3','-2','-1','-0','1','2','3','3.5',
'4','4.5','5','5.5','5.75','6','6.5','7','8','8.75','9','9.5',
'10','10.5','11','11.5','12','12.75','13','14');
$new = array();
$count = 0;
$found = false;
while($count < count($offsets))
{
foreach($abbr as $k => $v)
{
foreach($v as $tz)
{
if($tz['offset'] == $offsets[$count]*3600)
{
$new[$offsets[$count]] = $k;
$found = true;
break;
}
}
if($found)
{
$found = false;
break;
}
}
$count++;
}
print_r($new);
什么是“标准”时区缩写?
这没有标准。 任何人都不会正式协调时区缩写。 有一些在IANA TZDB中使用,但其中很多只是随机选择的。 经常有关于应该使用哪种缩写的争论。 例如,查看2013年4月列表存档中有多少篇关于澳大利亚缩写的帖子。
时区缩写的另一个列表可以在这里找到。 如果你仔细观察,你会发现很多都是模棱两可的。 例如, CST
可以是“中央标准时间”(美国),“中国标准时间”或“古巴标准时间”。 EST
可以是“东部标准时间”(美国)或“东部标准时间”(澳大利亚)。
一些非澳大利亚人可能更喜欢AEST
,但是谁能说A
应该是为澳大利亚而不是为美国?
另一个很常见的例子是,有些人使用HAST
作为夏威夷人,而另一些人则使用HST
因为他们可能不太在意阿拉斯加阿留申群岛(这是A
应该代表什么)。
重点在于,任何你找到的时区缩写的列表都是主观的和自以为是的。 没有标准。
我正在使用此下拉列表存储按时间偏移的时区:
请不要这样做。 时区不是一个偏移量,并且有24个以上的时区。 请阅读时区标记wiki,特别是标题为“时区!=偏移量”的部分。
从你的评论:
我现在意识到这一点,但是我的应用程序逻辑的其余部分已经以这种方式依赖于它,而我今天只有完成这一点,所以没时间去改变它。
然后,许多错误将继续存在于您的应用程序中。 你不能可靠地做到这一点 - 即使你的应用程序只在美国运行。 无论您使用的是哪种语言或平台,执行此操作都会导致很多转换错误。
我对这些阵列进行硬编码是可以的,我只是不知道美国以外的热门区域,我认为这样的列表已经存在于某个地方。
说到时区,你不应该硬编码任何东西。 时区规则一直在改变,因为它们受到世界各国政客的控制。 IANA时区数据库每年都会有多次更新。 在PHP方面,PHP文档明确了目前可用的版本,并且通过PECL的timezonedb处理更新 - 从IANA获取数据。
关于什么是“流行” - 这也是非常主观的。 TZDB中的区域出于某种原因都在那里。 我所知道的唯一试图限制这一点的地方是Ruby on Rails的ActiveSupport :: TimeZone。 他们声称拥有“146个区域的有意义的子集”,您可以在该页面上的MAPPING
常量中看到它。 但他们并没有说他们决定什么过程是有意义的,而且有明显的遗漏。 除非您知道每个用户的位置,否则我不会尝试确定要限制哪些区域。
如果你之后的东西是TZDB中所有578个区域的下拉列表,你可以尝试以下方法之一:
目前有两次下跌。 第一个选择一个国家。 第二个在该国内选择一个区域。 在PHP中,你可以看到当你调用DateTimeZone::listIdentifiers
,它接受一个可选的$country
参数来过滤列表。
一个很好的例子就是Google日历的设置:
使用基于地图的控件,以便用户可以按地点选择他们的时区。 这里有很多,但我最喜欢的是JavaScript。
例如,它可能看起来像这样:
请注意,虽然它显示了EDT
的TZDB缩写,但它仅用于显示方便。 在引擎盖下,你正在选择一个像America/New_York
这样的值。
最终,您需要为每个用户保存的是他们的IANA时区密钥,例如America/New_York
。 您无法使用-5
的值进行正确的时区转换,因为您没有关于什么时候切换到-4
所有规则。
更新
有一件事我没有从你原来的帖子中意识到,但你在评论中澄清说,你正在使用它来选择一个目标事件时区。 我想我应该首先要求环境。 我从为用户选择单个时区而不是特定事件的特定时区的角度来处理这个问题。
所有你真正需要一个事件在正确的时刻是当时的抵消。 因此,您可以使用您在问题中显示的下拉列表,但我会忽略任何区域名称。 它将从UTC-12:00
到UTC+14:00
UTC-12:00
在肠道内成为偏移列表。 看起来您已经确定存在一些30分钟和45分钟的偏移量。 如果你喜欢,你可以在这里验证你的假设。
一般问题是,许多人不知道抵消应该是什么。 通过列出每个区域名称的标准偏移量,您可能会误导用户选择错误的偏移量。 例如,他们可能会谈论夏季的日期,该日期应该属于美国东部夏令时(-4),但他们选择-5选择,而不是因为他们看到“东部”。 所以删除名称将有所帮助。
如果按照我原先建议的方式行事,并让他们选择实际的IANA时区,那么对于许多情况来说,这种方式会更好。 然而,你仍然需要考虑一种情况 - 如何处理模糊和无效的时间。 这些发生在DST转换期间。
例如,我可能会选择America/New_York
,并选择2013年11月3日凌晨1点的时间。由于后退过渡有两种不同的情况(EDT中的一个为-4,另一个为美国东部时间) -5)。 所以你的应用程序需要检查这个,并询问用户他们意味着哪两个。 同样,如果我于2013年3月10日上午2:00进入,您的应用程序应该告诉我该时间段不存在(由于弹簧转换)。
无论采用哪种方法,在实际存储事件时间时,请确保存储日期 - 时间 - 偏移量组合,或者应用偏移量以获取UTC的日期 - 时间。 你不希望有任何关于事件代表实际时刻的问题。
链接地址: http://www.djcxy.com/p/29407.html