【问题标题】:timezone_name_from_abbr() not recognizing correctlytimezone_name_from_abbr() 无法正确识别
【发布时间】:2013-10-27 19:07:45
【问题描述】:

基本上我的网站是全球性的,我需要能够检测用户的时区并显示准确的时间。我有这个非常简洁的脚本,它曾经完美地工作到现在。它需要一个时区偏移量,我使用 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 是欧洲/巴黎。我对日期和时区非常不满意,我非常需要帮助!

【问题讨论】:

    标签: php timezone


    【解决方案1】:

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

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

    即使是从一个时区缩写到一个时区的想法也不正确,因为多个时区可以共享相同的缩写。例如,“CST”可以是“Central Standard Time”(美国)、“Central Standard Time”(澳大利亚)、“Central Summer Time”(澳大利亚)、“China Standard Time”或“Cuba Standard Time”。详情请见this list

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-06
      • 2021-05-13
      • 1970-01-01
      • 2020-05-03
      • 1970-01-01
      • 2018-07-18
      • 2014-08-07
      • 2012-01-10
      相关资源
      最近更新 更多