Intereting Posts

strtotime отличается с часовым поясом

Кажется, я не очень хорошо понимаю функцию strtotime . В моем случае я хотел бы сравнить текущее время (сейчас) с конкретным временем в определенном часовом поясе

Например, конкретное время – «в этот понедельник в 14:00:00» в часовом поясе «Америка / Нью-Йорк»:

  $specificTime = strtotime("monday this week 14:00:00 America/New_York"); 

Мой текущий код:

  $now = strtotime("now America/New_York"); if ($now > $specificTime) { //do something } 

Но я понял, что $now выше на 6 часов вперед с текущим временем. Число 6, которое я предполагаю, со смещения -05: 00 of America / New_York, плюс 1 час дневного света.

он должен удалить часовой пояс из $now , он будет работать правильно:

  $now = strtotime("now"); if ($now > $specificTime) { //do something } 

Может ли кто-нибудь объяснить, почему strtotime("now America/New_York") на 6 часов вперед с strtotime("now) , почему они не эквивалентны?

PS: Я нахожусь в GMT + 07: 00.

Простая отладка:

 <?php $now = strtotime("now America/New_York"); echo date('r', $now); // Thu, 28 Nov 2013 16:39:51 +0100 

… показывает, что такая команда делает это:

  1. Вычисление локального времени в моем часовом поясе по умолчанию (10:39:51 +0100)
  2. Возвращает отметку времени, которая соответствует 10:39:51 в нью-йоркское время (-0500)

Управлять датой манипуляции со строками очень сложно. Представьте себе, что вы попытаетесь сделать математику со строковыми функциями: strtofloat('one plus square root of half hundred') было бы достаточно места для ошибок. Поэтому мой совет заключается в том, чтобы держать его простым и использовать только с простыми выражениями, когда есть какая-то польза, например strtotime('+1 day') .

Если вам нужно работать с разными часовыми поясами, я предлагаю вам использовать подходящие объекты DateTime . Если вы решите работать с отметками времени Unix, забудьте о часовых поясах: отметки времени Unix вообще не имеют информации о часовом поясе.

Для этого вы можете использовать DateTime . Я считаю, что настройки часового пояса в strtotime недопустимы.

 $specificTime = new DateTime("monday this week 14:00:00", new DateTimeZone("America/New_York"))); $now = new DateTime("now", new DateTimeZone("America/New_York")); 

Затем вы можете сравнить временную метку unix с этим:

 if ($now->getTimestamp() > $specificTime->getTimestamp()) { // do something ... } 

Между каждым часовым поясом есть временное смещение.

strtotime() времени Unix в соответствии с strtotime() .

Он будет использовать часовой пояс по умолчанию, если в этом параметре не указан часовой пояс.

Часовой пояс по умолчанию – это возвращаемое значение date_default_timezone_get() ;

Посмотрите код ниже:

 <?php // UTC echo date_default_timezone_get(), "\n"; // 2013-11-28 14:41:37 echo date('Ymd H:i:s', strtotime("now America/New_York")), "\n"; // 2013-11-28 09:41:37 echo date('Ymd H:i:s', strtotime("now")), "\n";