Я столкнулся с каким-то странным поведением функции strtotime()
при работе с относительными форматами даты.
Я живу в стране, где первый день недели – это не воскресенье, а понедельник. Этот факт должен отразиться на strtotime()
.
Проблема в том, что независимо от того, какой языковой стандарт я устанавливаю (я также strtotime()
локаль en_US
), strtotime()
просто странно, и ни понедельник, ни воскресенье не появляются на этой неделе. См. Пример ниже.
Сегодня, 2014-02-02 (или 02/02/2014, если вы … какая хорошая дата) – воскресенье. Исходя из этого, я попытался получить на неделю и воскресенье на этой неделе. Оба ушли.
<?php setlocale(LC_ALL, 'cs_CZ'); $sunday = new DateTime('2014-02-02'); echo '"Today" is Sunday, ' . $sunday->format('Ym-d') . "\n"; $thisWeekMonday = strtotime('monday this week', $sunday->getTimestamp()); $thisWeekSunday = strtotime('sunday this week', $sunday->getTimestamp()); echo "This week's Monday: " . date('Ym-d', $thisWeekMonday) . "\n"; echo "This week's Sunday: " . date('Ym-d', $thisWeekSunday) . "\n"; ?>
Код выше выходов:
"Today" is Sunday, 2014-02-02 This week's Monday: 2014-02-03 This week's Sunday: 2014-02-09
Если strtotime()
думает, что неделя начинается с воскресенья, она должна вернуть 2014-02-02 как «на этой неделе воскресенье», но это не так. Это означает, что, согласно strtotime()
, неделя начинается с понедельника. В этом случае «на этой неделе в понедельник» должно быть возвращено 2014-01-27, но это не так.
Такое поведение нелогично. Это ошибка PHP? Я делаю что-то неправильно? В случае, если это ошибка, какой был бы лучший способ решить эту проблему?
Странно, это на самом деле кажется ошибкой. Работа вокруг может включать проверку, чтобы увидеть, «сегодня воскресенье». Итак, что-то вроде:
$thisWeekSunday = ($sunday->format('w') == 0) ? $sunday->getTimestamp() : strtotime('sunday this week', $sunday->getTimestamp());