Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 什么是「;标准;时区缩写?_Php_Time_Timezone_Utc_Gmt - Fatal编程技术网

Php 什么是「;标准;时区缩写?

Php 什么是「;标准;时区缩写?,php,time,timezone,utc,gmt,Php,Time,Timezone,Utc,Gmt,我正在使用以下下拉列表为应用程序按存储时区: <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">[U

我正在使用以下下拉列表为应用程序按存储时区:

<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>
代码:

$abbr=DateTimeZone::ListAbstraints();
$offset=数组('-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;
而($countv)
{
外汇($v作为$tz)
{
如果($tz['offset']=$offset[$count]*3600)
{
$new[$offset[$count]]=$k;
$found=true;
打破
}
}
如有($已找到)
{
$found=false;
打破
}
}
$count++;
}
印刷(新);
“标准”时区缩写是什么

这方面没有标准。时区缩写没有任何人进行官方协调。有一些是在测试中使用的,但其中很多只是随机选择的。关于应该使用哪些缩略语,经常存在争论。例如,看看有多少关于澳大利亚缩写词的帖子

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

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

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

关键是,任何时区缩写的列表,无论你在哪里找到,都是主观的和固执己见的。没有标准

我使用此下拉列表按偏移量存储应用程序的时区:

<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>
请不要那样做。时区不是一个偏移量,其中有24个以上。请阅读,特别是标题为“时区!=偏移量”的部分

根据您的评论:

我现在意识到了这一点,但是我的应用程序逻辑的其余部分已经以这种方式依赖于它了,我只有今天来完成它,所以没有时间去改变它

然后,许多错误将继续出现在您的应用程序中。你不能可靠地做到这一点,即使你的应用程序只是在美国运行。无论您使用什么语言或平台,任何这样做的实现都会有很多转换错误

我可以硬编码这些数组,我只是不知道美国以外的流行区域是什么,我想这样的列表可能已经存在了

当涉及时区时,你不应该硬编码任何东西。时区规则一直在变化,因为它们由世界上每个国家的政治家控制。每年有多个更新发布到。在PHP方面,说明了当前可用的版本,以及通过从IANA获取数据来处理更新

关于什么是“流行”——这也是非常主观的。TZDB中的区域都是出于这样或那样的原因存在的。我所知道的唯一一个试图限制这一点的地方是RubyonRails。他们声称拥有“146个区域的有意义的子集”,你可以在该页面的
映射
常量中看到。但他们并没有说他们通过什么过程决定了什么是有意义的,而且有明显的遗漏。除非您知道每个用户的位置,否则我不会尝试决定限制哪些区域

如果您的目标不是TZDB中所有578个区域的下拉列表,您可以尝试以下方法之一:

  • 显示两个下拉列表。首先选择一个国家。第二种选择是在该国境内选择一个区域。在PHP中,您可以看到,当您调用时,它接受一个可选的
    $country
    参数来过滤列表

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

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

    例如,它可能如下所示:

请注意,虽然此处显示了TZDB的缩写
EDT
,但这只是为了方便显示。在引擎盖下,您选择的值类似于
美国/纽约

最终,您需要为每个用户保存的是他们的IANA时区键,例如
America/New_York
。仅使用值
-5
,无法进行正确的时区转换,因为您不具备将切换到
-4
的所有规则

更新

有一件事我在你最初的帖子中没有意识到,但你在评论中澄清了,那就是你用它来选择一个目标事件时区。我想我应该先问一下上下文。我是从为用户选择一个时区的角度来处理这个问题的,而不是为特定事件选择一个特定的时区

要使事件处于正确的时刻,您真正需要的是该时刻的偏移量。所以你可以使用一个下拉列表,就像你在问题中显示的一样,但我会省略任何区域名称。它通常是从
UTC-12:00
UTC+14:00
的偏移列表。看起来您已经确定了30分钟和45分钟的偏移量也存在。你可以验证你的假设
$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);