strtotime в неправильные даты

Я нашел что-то странное в strtotime ().

По датам, которые не существуют, он возвращается на следующий день.

$d30= strtotime("2017-06-30"); Echo $d30 ."\n"; Echo date("Ymd", $d30)."\n\n"; // 2017-06-30 $d31= strtotime("2017-06-31"); Echo $d31 ."\n"; Echo date("Ymd", $d31)."\n\n"; // 2017-07-01 $d32= strtotime("2017-06-32"); Echo $d32 ."\n"; Echo date("Ymd", $d32); // 1970-01-01 

https://3v4l.org/AjMAE

Я понимаю последнее. Он ничего не возвращает, поскольку это ошибка.
Но почему вторая возвращается в июле?
Должен ли он функционировать, если вы ошибаетесь, он «исправит вас»? Или это ошибка в strtotime ()?

Если вы посмотрите на документы для strtotime (), вы увидите первый параметр:

время
Строка даты / времени. Действительные форматы объясняются в форматах даты и времени .

Если вы переходите по ссылке для форматов даты и времени и переходите к форматам даты, вы увидите:

введите описание изображения здесь

Таким образом, для формата даты (Ie DD ), 01-31 действителен (поскольку за 3 может следовать только 0 или 1 ), несмотря на месяц. В зависимости от месяца поставки и даты дата будет скорректирована.

Также можно найти в примечаниях на той же странице:

Примечание .
Возможно переполнение и недопустимость формата dd и DD . День 0 означает последний день предыдущего месяца, а переполнение – в следующем месяце. Это означает, что «2008-08-00» эквивалентен «2008-07-31» и «2008-06-31», эквивалентный «2008-07-01» (в июне всего 30 дней). 1

Следовательно, 06-31 действует, а значение 06-32 недействительно.

Кроме того, в разделе « Пользовательские примечания » примечание Мирека от 2015-04-01 01:14 может быть полезным / интересным:

Примечание: день (dd или DD) сначала проверяется на диапазон 0..31, и только если он подходит, может применяться механизм переполнения и нижнего потока. Если нет, strtotime () просто возвращает значение false. Если вам нужно неограниченное превышение / underflow для расчета даты (например, 2015-01-40 – 2015-02-09), вместо этого используйте mktime () . 2


1 http://php.net/manual/en/datetime.formats.date.php

2 http://php.net/manual/en/datetime.formats.date.php#Hcom117014

Как можно сделать 31 день, strtotime() исправит дату для вас. Если вы попробуете его в феврале (2017-02-31), он будет исправлен до 2017-03-03 . Это то, что вы нашли.

Итак, что он в основном делает:

  1. получить дату
  2. проверьте, находится ли дата в допустимом диапазоне (дни в месяц)
  3. если недействительный счет дней в следующем месяце

Это поведение реализовано в самой функции strtotime .

Был замечательный комментарий на странице документации об этом, но я больше не могу его найти. В этом комментарии содержится дополнительная информация (обязательно проверьте ссылку в комментарии).