strtotime result не имеет смысла, ошибка php?

Следующая строка:

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() пытается «понять» английский, я думаю, вы и говорите на разных диалектах 🙂

Обновление # 1:

После некоторого чтения в исходном коде 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 , за которым следует имя дня недели (полное или сокращенное) и последующее значение, обрабатывается как день недели предоставленного месяца (или текущего месяца, если ни один не указан в строке).

Обновление # 2

После того, как я узнал, что формат строки, принятой 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.