为什么我的时区设置不起作用


Why is my timezone setting not working?

我一定在做傻事。以下代码应创建相对于设置的时区字符串的时间戳。但是,它始终创建相对于服务器默认时区的时间戳。

        $this->timezone = "America/Edmonton";
        /*Server's default timezone is "America/Toronto"*/
        $n->sendTime = "13:25:00";
        $objTimeZone = new DateTimeZone($this->timezone);
        $objSendTime = new DateTime($n->sendTime);
        $objSendTime->setTimezone($objTimeZone);
        $sendTime = $objSendTime->getTimeStamp();
        $timeNow = time(); //Timestamps are all relative to UTC
        if (($timeNow - $sendTime) > 300 || ($timeNow - $sendTime) < 0){
            //Send time is not within last 5 minutes or is in future//
            echo "Don't Send!";
        }
        echo "Send!";

预期行为:如果时间在山区时间 13:25:00 的 5 分钟内,代码将回显"发送!

实际行为:如果时间在东部时间 13:25:00 的 5 分钟内,代码将回显"发送!

谁能向我解释为什么 setTimezone() 不能按预期工作?

PHP 函数 Datetime::getTimeStamp 获取系统的 Unix 时间戳,这就是为什么即使您将变量时区更改为埃德蒙顿时区,您的$sendTime变量仍然是东部时间的时间。

作为证明,如果你执行$objSendTime->getTimestamp(),它将返回1456424700,即13:25:00的UNIX时间戳。

您可以改为这样做,这会将对象的时间格式化为适当的时间字符串,并使用内置函数 strtotime 将其转换为时间:

$sendTime = strtotime($objSendTime->format('Y-m-d H:i:s'));

这将转换适当的时间 (11:25:00) 而不是 13:25:00。另一种选择是将默认时区设置为埃德蒙顿。

date_default_timezone_set('America/Edmonton');
$sendTime = $objSendTime->getTimestamp(); // 1456417500 (11:25:00)