$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()不能按预期工作吗?
答案 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)