Подтвердить что ты не робот

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

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

echo date('d', strtotime('First Saturday August 2015'));

выводит 08, что, похоже, не имеет никакого смысла, потому что первое появление дня недели не может быть после 7-го.

Является ли это ошибкой php или ошибкой php или, возможно, даже ошибкой php? Я не знаю...

версия php: 5.5.19

4b9b3361

Ответ 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".

Ответ 3

Как указано, PHP не совсем понял ваш выбор диалекта. Если вы планируете принимать разнообразные данные от своих пользователей (не плохая идея), чтобы выразить дату, я предлагаю сделать некоторую нормализацию этого пользователя самостоятельно, чтобы вы могли представить предсказуемый формат в strtotime.