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

时间:2016-02-25 18:41:23

标签: php datetime

我必须做些蠢事。以下代码应创建相对于设置的时区字符串的时间戳。但是,它始终会相对于服务器的默认时区创建时间戳。

        $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分钟内,代码将回显&#34;发送!&#34;;

实际行为:如果时间在东部时间13:25:00的5分钟内,则代码回应&#34;发送!&#34;;

有人可以向我解释为什么setTimezone()不能按预期工作吗?

1 个答案:

答案 0 :(得分:1)

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

作为证明,如果您执行 $ objSendTime-&gt; getTimestamp(),它将返回 1456424700 ,这是UNIX时间戳13:25:00。

您可以这样做,这会将对象的时间格式化为适当的时间字符串,并使用内置函数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)