ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

php – 什么是“标准”时区缩写?

2019-09-11 01:30:14  阅读:356  来源: 互联网

标签:gmt php timezone time utc


我使用此下拉列表为应用程序存储时区offset-from-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 &amp; 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);

解决方法:

What are the “standard” timezone abbreviations?

没有标准.任何人都没有正式协调时区缩写.在IANA TZDB中有一些使用,但其中很多只是随机选择.关于应该使用哪些缩写经常存在争议.例如,查看有关澳大利亚缩写in the list archives for April 2013的帖子数量.

另一个时区缩写列表可以在here找到.如果你仔细观察,你会发现很多都是模棱两可的.例如,CST可以是“中央标准时间”(美国),“中国标准时间”或“古巴标准时间”. EST可以是“东部标准时间”(美国),或“东部标准时间”(澳大利亚).

一些非澳大利亚人可能更喜欢AEST,但是谁会说A应该是针对澳大利亚而不是针对美国?

另一个非常常见的例子,有些人使用HAST进行夏威夷,而其他人则使用HST,因为他们不太关心阿拉斯加的阿留申群岛(这是A应该代表的).

关键是任何时区缩写列表,无论你找到哪一个,都是主观的和自以为是的.没有标准.

I am storing timezone by offset for an application using this dropdown:

请不要这样做.时区不是偏移量,其中有超过24个.请阅读the timezone tag wiki,特别是标题为“Time Zone!= Offset”的部分.

从你的评论:

I realize this now, however the rest of my application logic depends on it this way already, and I only have today to complete this, so no time to change it.

然后,您的应用程序中将继续出现许多错误.你无法可靠地做到这一点 – 即使你的应用只是在美国运行也是如此.无论您使用何种语言或平台,任何执行此操作的实现都会有很多转换错误.

I’m ok with hardcoding these arrays, I just don’t know what the popular zones are outside of the US, I figured such a list would already exist somewhere.

说到时区,你不应该对任何东西进行硬编码.时区规则一直在变化,因为它们是由世界上每个国家的政治家控制的.每年都有多次向IANA time zone database发布更新.在PHP方面,PHP documentation明确了当前可用的版本,并且更新是通过PECL’s timezonedb处理的 – 它从IANA获取数据.

关于什么是“流行” – 这也是非常主观的.由于种种原因,TZDB中的区域都存在.我知道唯一一个试图限制它的地方是Ruby on Rails的ActiveSupport::TimeZone.他们声称拥有“146个区域的有意义的子集”,您可以在该页面上的MAPPING常量中看到它们.但是他们并没有说出他们已经决定了哪些过程被认为是有意义的,并且有明显的遗漏.除非您知道每个用户所在的事实,否则我不会尝试确定要限制的区域.

如果您的后续内容是TZDB中所有578个区域的下拉列表,您可以尝试以下方法之一:

>提出两个下降.第一个选择一个国家.第二个选择该国家/地区内的区域.在PHP中,您可以看到当您调用DateTimeZone::listIdentifiers时,它会接受一个可选的$country参数来过滤列表.

一个很好的例子就是Google日历的设置:

>使用基于地图的控件,以便用户可以按位置选择时区.有很多这样的,但我最喜欢的是this one的JavaScript.

例如,它可能如下所示:

请注意,虽然它在这里显示了EDT的TZDB缩写 – 它仅用于显示方便.在引擎盖下,您正在选择像America / New_York这样的值.

最终,您需要为每个用户保存的是他们的IANA时区密钥,例如America / New_York.您只能使用值-5来执行正确的时区转换,因为您没有将切换到-4的所有规则.

更新

我在原帖中没有意识到的一件事,但你在评论中澄清,是你用它来选择目标事件时区.我想我应该首先要求上下文.我从为用户选择单个时区的角度来看待这个问题,而不是针对特定事件的特定时区.

事件在正确的时刻真正需要的是那一刻的偏移.所以你可以使用你在问题中显示的下拉菜单 – 但我会省略任何区域名称.它通常是从UTC-12:00到UTC 14:00的偏移列表.看起来您已经确定已存在约30分钟和45分钟的偏移量.如果您愿意,可以验证您的假设here.

但一般的问题是,许多人不知道偏移应该是什么.通过为每个区域名称添加具有标准偏移量的列表,可能会误导用户选择错误的偏移量.例如,他们可能在谈论夏季的日期应该落入美国东部夏令时(-4),但他们选择-5选择,因为他们看到“东方”.所以删除名称将有所帮助.

如果你采用我最初建议的方式并让他们选择一个实际的IANA时区,那么对于许多场景来说,这样做会更好.但是,仍然需要考虑一个场景 – 如何处理模糊和无效的时间.这些发生在DST过渡期间.

例如,我可能会选择America / New_York,并选择2013年11月3日凌晨1:00的时间.由于回退过渡,有两个不同的实例(EDT为-4,另一个为EST) -5).所以你的应用程序需要检查这个并询问用户他们意味着哪两个.同样,如果我在2013年3月10日凌晨2点进入,您的应用应该告诉我该区域中不存在此时间(由于春季转发).

无论使用哪种方法,当涉及实际存储事件时间时,请确保存储日期 – 时间 – 偏移组合,或者应用偏移量以获得UTC的日期时间.您不希望对事件所代表的实际时刻有任何疑问.

标签:gmt,php,timezone,time,utc
来源: https://codeday.me/bug/20190911/1802766.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有