Кажется, я не очень хорошо понимаю функцию 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
… показывает, что такая команда делает это:
Управлять датой манипуляции со строками очень сложно. Представьте себе, что вы попытаетесь сделать математику со строковыми функциями: 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";