Ответ 1
Обновление № 1: объяснено, что большая разница в том, что простое слово, например "of
" , после небольшого изучения исходного кода PHP.
Обновление # 2: На самом деле есть страница документации по руководству PHP, в которой объясняются форматы дат принят strftime()
. Я до сих пор не знал об этом. Спасибо @Outspaced за предоставление ссылки в их ответе.
Для быстрого и простого чтения пропустите раздел Обновить # 1.
Исходный ответ:
Действительно,
echo date('Y-m-d', strtotime('First Saturday August 2015'));
печатает:
2015-08-08
Но
echo date('Y-m-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 st от августа 2015 года), что является разумным предположением (возможно, единственное, что я думаю).
First Saturday
является относительным выражением. Это относительно абсолютной отметки, указанной в строке (August 2015
) или в качестве второго параметра strtotime()
, и "shifts" отметка времени абсолютной отметки назад или вперед с некоторой суммой.
Объединяя их, strtotime()
интерпретирует First Saturday August 2015
как First Saturday
подсчет с August 1, 2015
, и это действительно August 8, 2015
.
С другой стороны, First Saturday of August 2015
анализируется с помощью другого правила. Один из next
, last
, previous
, this
или любой порядковый номер от first
до twelfth
, за которым следует имя недели (полное или сокращенное) и затем of
обрабатывается как день недели предоставленного месяца (или текущего месяца, если в строке не указано).
Обновление # 2
После того, как я узнал, что формат строки, принятой strtotime()
, на самом деле объяснен в документации PHP, объяснение стало более простой. Взгляните на второй " Примечание:" на странице документации.
First Saturday August 2015
объясняется в пункте № 4 в примечании:
"ordinal dayname" делает переход на другой день.
First Saturday of August 2015
объясняется в пункте № 6 примечания:
"порядковый номер дня" из "" не переходит к другому дню.
Примечание заканчивается целым блоком объяснений, посвященным магическому слову " of
".