timezone_name_from_abbr()无法正确识别

php*_*_qq 1 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');
}
Run Code Online (Sandbox Code Playgroud)

问题是,我目前正在测试的时区是欧洲/赫尔辛基,它是UTC + 2(没有夏令时),但是由于某种原因timezone_name_from_abbr()决定2 * 3600是欧洲/巴黎。我真的对日期和时区感到很失望,请务必提供帮助!

Mat*_*int 5

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

您可以在此处查看所有时区的列表以及它们的标准和夏令时偏移量。

甚至从时区缩写转到时区的想法也不是很合理,因为多个时区可以共享相同的缩写。例如,“ CST”可以是“中部标准时间”(美国),“中部标准时间”(澳大利亚),“中部夏令时”(澳大利亚),“中国标准时间”或“古巴标准时间”。有关详细信息,请参见此列表

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

如果您正在检测用户的时区,请考虑使用JavaScript库jsTimeZoneDetect。它也不是完美的,但它通常可以工作,并且基于更逻辑的算法。