Я нашел что-то странное в 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
. Это то, что вы нашли.
Итак, что он в основном делает:
Это поведение реализовано в самой функции strtotime
.
Был замечательный комментарий на странице документации об этом, но я больше не могу его найти. В этом комментарии содержится дополнительная информация (обязательно проверьте ссылку в комментарии).