2016-02-25 6 views
0

Должно быть, я делаю что-то глупое. Следующий код должен создать временную метку относительно заданной строки часового пояса. Однако он всегда создает метку времени по сравнению с часовым поясом сервера по умолчанию.Почему моя настройка часового пояса не работает?

 $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!"; 

Ожидаемое поведение: если время в пределах 5 минут 13:25:00 Время в горах, код будет эхом «Отправить!»;

Фактическое поведение: если время находится в пределах 5 минут 13:25:00 по восточному времени, код перекликается с «Отправить!»;

Может кто-нибудь объяснить мне, почему setTimezone() не работает должным образом?

+0

'Американский/Эдмонтон' не действительный часовой пояс, используйте' America/Edmonton'. – ForguesR

+0

Это опечатка - нет в фактическом коде. – fred2

ответ

1

Функция PHP Datetime :: getTimeStamp получает временную метку Unix системы, поэтому, несмотря на то, что вы изменяете часовой пояс переменной для часовой пояс в Эдмонтоне, ваша переменная $ sendTime по-прежнему является временем Восточного времени.

В качестве доказательства, если вы $ objSendTime-> getTimestamp(), он вернется , который является UNIX Отметка 13:25:00.

Вы могли бы сделать это вместо того, что формат будет время объекта на соответствующую строку времени и превратить его в время с помощью встроенной функции StrToTime:

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

Это конвертировать подходящее время (11: 25:00) вместо 13:25:00. Другой вариант - установить часовой пояс по умолчанию для Edmonton.

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

Отличный ответ, спасибо. – fred2

Смежные вопросы