代码之家  ›  专栏  ›  技术社区  ›  Ben

如何在PHP中处理时区差异计算?

  •  4
  • Ben  · 技术社区  · 14 年前

    我被告知下面这种计算用户本地时间的方法有时不起作用。在PHP中最好的方法是什么?你是做什么的?

    public function getTimeOffset ($time) {
        $this->_cacheTimeOffset();  
        if ($this->timeOffsetExecuted) {
            $d = date("O");
            $neg = 1;
    
            if (substr($d, 0, 1) == "-") {
                $neg = -1;
                $d = substr($d, 1);
            }
    
            $h = substr($d, 0, 2)*3600;
            $m = substr($d, 2)*60;
    
            return $time + ($neg * ($h + $m) * -1) + (($this->timeOffset + $this->getDstInUse()) * 3600);
        }
        return $time;
    }
    
    4 回复  |  直到 14 年前
        1
  •  2
  •   Qix - MONICA WAS MISTREATED    9 年前

    使用DateTime扩展名,例如 DateTime::getOffset ,
    DateTimeZone::getOffset

    一些国家可能已经执行了几个时区更新,
    这种方法 DateTimeZone::getTransitions 揭示过渡历史

        2
  •  1
  •   Qix - MONICA WAS MISTREATED    9 年前
    date('Z');
    

    以秒为单位返回UTC偏移量。

        3
  •  0
  •   Community rcollyer    7 年前

    刚刚回答了一个非常相似的问题 over here . 我建议您检查一下;我解释了两种进行时区偏移量计算的首选方法(使用简单的数学,然后 datetimezone datetime 课程)相当彻底。

    第一种方法是最简单的 (也是最合乎逻辑的)方式,那就是 存储它们的偏移量(如果您已经 拥有它,也就是说)然后乘以 3600(1小时秒),然后添加 那个 值设置为当前unix时间戳,以获取 跑步。

    另一种方法是使用 DateTime DateTimeZone 上课。 这两个类是如何工作的,如图所示 here ,就是你创造了两个 日期时区 对象,一个 时区和他们的时区;创建 二 日期时间 对象与第一个 参数为 "now" 以及 日期时区 上面的对象 (分别);然后调用 getOffset 方法打开 你的 时区 对象传递 他们的 时区对象 作为第一个参数,最终 以秒为单位得到偏移量 可以添加到当前的unix 时间戳以获取 他们的 作业需要运行。

        4
  •  -1
  •   RabidFire    14 年前

    快速解决方案:

    <?php echo date('g:i a', strtotime("now + 10 hours 30 minutes")); ?>