Добрый день, столкнулся с проблемой. Нужно вывести цикл дат на экран, взятые из формы. При стандартном формате Y-m-d проблем нет, считает все как надо, однако когда разворачиваю в формат dmY - считает только дни. К примеру 01.01.16 и 05.02.16 - выведет 5 дат до 05.01.16. В чем моя ошибка? PHP: <?php if (isset($_POST['maindate1'])) { $maindate1 = $_POST['maindate1']; } $date_begin = date('d.m.Y', strtotime($maindate1)); if (isset($_POST['maindate2'])) { $maindate2 = $_POST['maindate2']; } $date_end = date('d.m.Y', strtotime($maindate2)); $date = $date_begin; while ($date <= $date_end) { echo $date . "</br>"; $date = date('d.m.Y', strtotime($date . '+1 days')); } ?>
потому что ты работаешь со строками. функция date() возвращает строку! сравнение строк работает так — посимвольно. советую сравнивать даты в виде "отметки времени" другими словами unix timestamp. это целое число. бОльшая дата это бОльшее число. https://php.ru/forum/threads/rabota-s-datoj-v-mysql-php-zagotovka-faq.50838/ (в самом крайнем случае ты можешь работать с грубым хаком, оставляя дату в формате ГГГГ-ММ-ДД, при таком раскладе посимвольное сравнение даст тот же результат, что и сравнение истинных дат, т.к. более значимые цифры стоят раньше.)
Код (Text): <?php if (isset($_POST['maindate1'])) { $maindate1 = $_POST['maindate1']; } $date_begin = strtotime($maindate1); if (isset($_POST['maindate2'])) { $maindate2 = $_POST['maindate2']; } $date_end = strtotime($maindate2); $date = $date_begin; while ($date <= $date_end) { echo date('d.m.Y', $date) . "</br>"; $date = strtotime('+1day', $date); } ?> Спасибо большое, разобрался! Я на верном направлении? Небольшой вопрос, а как лучше использовать плюс в цикле, строкой strtotime('+1day', $date) или $date+86400?
зависит от желаемого результата. если в выбранном часовом поясе нет перехода на летнее время, то результат одинаковый. --- Добавлено --- P.S. избавься от привычки ставить ?> в конце каждого php скрипта. в старых учебниках так писали, а сейчас это признано вредной практикой, т.к. ты не видишь есть ли за этим ?> пустая строка (которая будет выведена!)