timezone_name_from_abbr()无法正确识别

时间:2013-10-27 19:07:46

标签: php timezone

基本上我的网站遍布全球,我需要能够检测用户的时区并显示准确的时间。我有这个非常简洁的脚本,直到现在才能完美地工作。它需要一个时区偏移量,我用javascript获取并通过cookie。

if(!empty($_COOKIE['tz']) && $_COOKIE['tz']>=-12 && $_COOKIE['tz']<=13){
    $offset = $_COOKIE['tz'];
    $tz = timezone_name_from_abbr(null, $offset * 3600, true);
    if($tz === false) $tz = timezone_name_from_abbr(null, $offset * 3600, false);
    date_default_timezone_set($tz);
}else{
    date_default_timezone_set('UTC');
}

问题是目前我正在测试的时区是欧洲/赫尔辛基,即UTC + 2(没有夏令时),但出于某种原因timezone_name_from_abbr()决定2 * 3600是欧洲/巴黎。我对日期和时区真的很糟糕,我非常需要帮助!

1 个答案:

答案 0 :(得分:4)

一般情况下,根据偏移量(例如UTC + 02:00)定位精确时区(例如Europe/HelsinkiEurope/Paris)的想法是不可能的。可靠性或准确性。许多时区在任何给定时间点共享相同的偏移量,并且由于夏令时规则,许多时区在一年中在两个不同的偏移之间切换。

您可以看到所有时区的列表,以及它们的标准和日光偏移here

即使是从时区缩写到时区的想法也不合适,因为几个时区可以共享相同的缩写。例如,“CST”可以是“中央标准时间”(美国),“中央标准时间”(澳大利亚),“中央夏令时”(澳大利亚),“中国标准时间”或“古巴标准时间”。有关详细信息,请参阅this list

考虑到这些问题,PHP会给你一个名为timezone_name_from_abbr的函数,这很奇怪。我建议避免使用它,因为它在概念上显然存在缺陷。

如果您在检测到用户的时区后,请考虑使用JavaScript库jsTimeZoneDetect。它也不完美,但它一般都有效,并且基于更合理的算法。