Следующая строка:
echo date('d', strtotime('First Saturday August 2015'));
печатает 08
, что, похоже, не имеет никакого смысла, потому что первое появление дня недели не может быть после 7-го.
Это ошибка php или ошибка php или даже ошибка php? Я не знаю…
Версия для PHP: 5.5.19
Обновление №1: объяснено ниже большая разница, которую делает простое слово типа « of
» , после того, как я немного исследовал исходный код PHP.
Обновление № 2: На самом деле есть страница документации в руководстве по PHP, в которой объясняются форматы дат, принятых strftime()
. Я до сих пор не знал об этом. Спасибо @Outspaced за предоставление ссылки в их ответе.
Для быстрого и легкого чтения пропустите раздел « Обновление № 1» .
В самом деле,
echo date('Ym-d', strtotime('First Saturday August 2015'));
печатает:
2015-08-08
Но
echo date('Ym-d', strtotime('First Saturday of August 2015'));
печатает правильную дату:
2015-08-01
Поскольку strtotime()
пытается «понять» английский, я думаю, вы и говорите на разных диалектах 🙂
После некоторого чтения в исходном коде PHP функции strtotime()
, я думаю, что он разбирает First Saturday August 2015
в First Saturday
после August 2015
.
August 2015
является абсолютным выражением и потому, что нет никаких указаний о том, что он производит 2015-08-01
(1 августа 2015 года), что является разумным предположением (единственное, что я думаю).
First Saturday
– относительное выражение . Это относительно абсолютной отметки, указанной в строке ( August 2015
) или в качестве второго параметра strtotime()
и «сдвигает» strtotime()
метку абсолютной отметки назад или вперед с некоторой суммой.
strtotime()
их, strtotime()
интерпретирует First Saturday August 2015
как First Saturday
с August 1, 2015
и это действительно August 8, 2015
.
С другой стороны, First Saturday of August 2015
анализируется с использованием другого правила . Один из next
, last
, previous
, this
или любого порядкового номера с first
по twelfth
, за которым следует имя дня недели (полное или сокращенное) и последующее значение, обрабатывается как день недели предоставленного месяца (или текущего месяца, если ни один не указан в строке).
После того, как я узнал, что формат строки, принятой strtotime()
, фактически объясняется в документации PHP, объяснение стало более простым. Взгляните на второе поле « Примечание: » на странице документации .
First Saturday August 2015
поясняется в пункте 4 в примечании:
«порядковое имя дня» продвигается к другому дню.
First Saturday of August 2015
поясняется в пункте 6 примечания:
«ordinal dayname» of «» не продвигается к другому дню.
Записка заканчивается целым блоком объяснений, посвященным волшебному слову « of
».
Вам нужно «из»:
date('d/m/Y', strtotime('First Saturday of August 2015'))
см. руководство: http://docs.php.net/manual/en/datetime.formats.relative.php
Как уже говорилось, PHP не совсем понял ваш выбор диалекта. Если вы планируете принимать разнообразные данные от своих пользователей (не плохая идея), чтобы выразить дату, я предлагаю сделать некоторую нормализацию этого пользователя самостоятельно, чтобы вы могли представить предсказуемый формат в strtotime.