strtotime php-функция не работает должным образом - PullRequest
3 голосов
/ 22 августа 2011

Я пытаюсь написать немного php, чтобы определить дату (формат Y-m-d) для следующего вхождения данного дня недели.

date('Y-m-d', strtotime('next monday'));

возвращается

2011-08-29

вместо

2011-08-22

на моем сервере. Не уверен почему. Мой сервер - это экземпляр EC2 в центре обработки данных Amazon на восточном побережье США, и в настоящее время он работает 2011-08-21 9: 40: 00.

РЕДАКТИРОВАТЬ 1 Также date('Y-m-d', strtotime('next sunday')); возвращает 2011-08-28 вместо сегодняшнего дня. Я опробовал этот код на http://writecodeonline.com/php/ ... начинаю думать, что тестер неточен.

Ответы [ 4 ]

2 голосов
/ 22 августа 2011

То, что ваш сервер настроен на определенный часовой пояс, не обязательно означает, что PHP будет работать в том же часовом поясе. Это уже понедельник, 22 августа 2011 года в Европе, который также включает UTC. Если ваш PHP работает в этом часовом поясе, «следующий понедельник» будет 29 августа.

Вам следует дважды проверить настройки часового пояса в PHP. Вы можете либо запустить date_default_timezone_get(), чтобы проверить, какие настройки использует ваша установка, либо попробовать заставить ваш скрипт PHP использовать часовой пояс, который вы ожидаете с date_default_timezone_set("America/New_York");, и посмотреть, получите ли вы ожидаемый результат.

Я только что проверил это:

date_default_timezone_set("America/New York");
echo date('Y-m-d', strtotime('next monday')); // prints 2011-08-22
date_default_timezone_set("UTC");
echo date('Y-m-d', strtotime('next monday')); // prints 2011-08-29
0 голосов
/ 22 августа 2011

«Далее», когда используется с рабочими днями, обычно означает первый после следующего ближайшего. Например, если сегодня воскресенье 21-го, то «следующий» понедельник не завтра 22-го, а следующий понедельник 29-го.

Я знаю, что это не обязательно интуитивно и не признается повсеместно, но я верю, что именно так strtotime() интерпретирует «следующий».

РЕДАКТИРОВАТЬ: я подтвердил через мои собственные тесты, что я не прав, и что «следующий» должен вернуть первый предстоящий день недели (22-й в моем примере выше). Я оставлю этот ответ здесь без изменений, так как приведенный ниже комментарий может быть полезен для других.

0 голосов
/ 22 августа 2011

Я думаю, что это ожидаемое поведение, так как понедельник еще не прошел, strtotime видит его как следующий понедельник.

0 голосов
/ 22 августа 2011

Какую версию PHP вы используете? В некоторых версиях PHP strtotime имеет некорректное поведение.

Я нашел это на strtotime странице справочника:

5.0.2 В PHP 5 до 5.0.2 "сейчас" и другие относительные времена неправильно вычисляются с сегодняшней полуночи. Это отличается от других версий, где он правильно рассчитан из текущего времени.

5.0.0 Допускаются микросекунды, но они игнорируются.

4.4.0 В версиях PHP до 4.4.0 значение «next» неправильно вычисляется как +2. Типичное решение этой проблемы - использовать «+1».

Ваше описанное поведение предполагает, что у вас есть версия между 5.0 и 5.0.2 .

Я предлагаю вам проверить, превышает ли разница между сегодняшним днем ​​и вычисленным " в следующий понедельник " больше 7 дней. Если это так, вычтите 7 дней, и у вас будет фактическая дата.

Попробуйте использовать этот код:

$days = ((strtotime('next monday') - time()) / 60 / 60 / 24);
if ($days >= 8) {
  $days -= 7;
}

Я знаю, что есть функция date_diff , но если ваша версия PHP настолько мала, как мне кажется, она недоступна для вас (извините, только 5.3.0 и выше).

...