Intereting Posts

Месяцы с менее чем 31 дней, опущенные из списка

Рассмотрим следующий код, который работал отлично вчера, но теперь сегодня (30 марта) он прекратил работу …

<form class="date"> <select name="date" onchange="this.form.submit()"> <?php for ($i = 0; $i <= 60; ++$i) { $time = strtotime(sprintf('+%d months', $i)); $value = date('Y-m', $time); $label = date('F Y', $time); $nowvalue = date('Y-m'); $nowlabel = date('F Y'); if(isset($_GET['date'])) { if(strcmp($value,$_GET['date']) == 0) { //If 0, $value and $_GET['date'] are the same: The option is selected printf('<option value="%s" selected>%s</option>', $value, $label); } else { printf('<option value="%s">%s</option>', $value, $label); } } else { if($value == $nowvalue) { printf('<option value="%s" selected>%s</option>', $value, $label); } else { printf('<option value="%s">%s</option>', $value, $label); } } } ?> </select> </form> 

Это выводит список выбора предстоящих месяцев, который заменяет, повторно загружает страницу с другим запросом в URL-адресе для календаря на этой странице, чтобы реагировать.

Если я вручную обновляю запрос в URL-адресе, он отлично работает, но этот список выбора повторяет даты, посмотрите на изображение ниже …

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

Возможно, это совпадение, что все месяцы с самыми короткими днями отсутствуют или фактически заменены тем же именем, что и месяцем раньше?

У кого-нибудь есть идея, почему это может произойти?

Solutions Collecting From Web of "Месяцы с менее чем 31 дней, опущенные из списка"

Это связано с тем, что, когда вы набираете даты на ежемесячной основе 31-го числа месяца, вы столкнетесь с месяцами, которые имеют менее 30 дней. PHP автоматически корректирует дату до последнего дня месяца, но вместо этого отправляется в конце месяца, а затем добавляет оставшиеся дни и получает дату, которая будет в следующем месяце.

Так что, если вы доберетесь до февраля, у которого всего 28 дней (большинство лет), он доберется до 28-го и добавит три дня и даст вам 3 марта.

Чтобы решить эту проблему, вам нужно установить дату в первый день месяца, а затем перебрать даты.

Это просто FYI, поскольку я понимаю, что вы добавили свой собственный ответ.

Вместо этого вы можете использовать DateTime() для упрощения кода (если хотите).

Таким образом, вы можете получить что-то вроде:

 <select name="date" onchange="this.form.submit()"> <?php $selected = DateTime::createFromFormat('Ym-d', @$_GET['date'] . '-01') ?: new DateTime('first day of this month'); for ($i = 0; $i <= 60; $i++) { $date = (new DateTime('first day of this month'))->modify("+$i months"); $select = $date == $selected ? 'selected' : ''; printf('<option value="%s" %s>%s</option>', $date->format('Y-m'), $select, $date->format('F-Y')); } ?> </select> 

Надеюсь это поможет!

Как отметил Джон Конде, это потому, что сегодняшние даты (31-й) плюс один месяц действительны 1 мая, а апрель пропускается.

Я сделал следующее, чтобы установить дату до 1-го числа месяца, затем плюс один месяц …

 <?php for ($i = 0; $i <= 60; ++$i) { $firstofthismonth = '01-' . date('m-Y'); $time = strtotime(sprintf($firstofthismonth . '+%d months', $i)); $value = date('Y-m', $time); $label = date('F Y', $time); $nowvalue = date('Y-m'); $nowlabel = date('F Y'); if(isset($_GET['date'])) { if(strcmp($value,$_GET['date']) == 0) { //If 0, $value and $_GET['date'] are the same: The option is selected printf('<option value="%s" selected>%s</option>', $value, $label); } else { printf('<option value="%s">%s</option>', $value, $label); } } else { if($value == $nowvalue) { printf('<option value="%s" selected>%s</option>', $value, $label); } else { printf('<option value="%s">%s</option>', $value, $label); } } } ?>