Месяцы не отображаются правильно с переполнением стека

Мне интересно, что я делаю не так?

Я создаю цикл php для отображения следующих 3-х лет месяцев.

Мой код:

<div class="input-group col-lg-2 col-md-12 col-sm-12 search">
<label class="bd-form-label">Dates</label>
<select name="date" id="search_date">
<?php
echo '<option value="all">Any Month</option>';
for ($i = 0; $i <= 36; $i++) {
$time = strtotime(sprintf('+%d months', $i));
$label = date('F Y', $time);
echo "<option value='$label'>$label</option>";
}
?>
/select>
</div>

Отображает все месяцы, но не февраль (2018-2019-2020)

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

Есть отзывы? Это что-то с моим кодом? Потому что я не могу найти никаких ошибок

3

Решение

Мы находимся в конце месяца (30 октября). Если вы добавите фиксированный параметр времени в strtotime (начало текущего месяца, 1 октября), февраль появится в списке. Причина кроется в том, как strtotime обрабатывает параметр «месяц»

<div class="input-group col-lg-2 col-md-12 col-sm-12 search">
<label class="bd-form-label">Dates</label>
<select name="date" id="search_date">
<?php
echo '<option value="all">Any Month</option>';
$start = strtotime('first day of this month');
for ($i = 0; $i <= 36; $i++) {
$time = strtotime(sprintf('+%d months', $i), $start);
$label = date('F Y', $time);
echo "<option value='$label'>$label</option>";
}
?>
</select>
</div>
4

Другие решения

Начните свою итерацию с первого дня текущего месяца, чтобы получить правильные результаты:

<?php

$date = new \DateTime('first day of this month');

for ($i = 0; $i <= 36; $i++) {
$date->modify("+1 months");
echo $date->format('F Y');
}

?>

Будет выводить:

Ноябрь 2017
Декабрь 2017
Январь 2018
Февраль 2018
Март 2018
Апрель 2018 …

3

Проблема «+1 месяц» с strtotime

Принимая во внимание следующий комментарий из руководства по PHP:

Как отмечалось в нескольких блогах, strtotime () решает проблему «+1 месяц» («следующий месяц») в дни, которые
не существует в следующем месяце иначе, чем другие
реализации, такие как, например, MySQL.

<?php
echo date( "Y-m-d", strtotime( "2009-01-31 +1 month" ) ); // PHP:  2009-03-03
echo date( "Y-m-d", strtotime( "2009-01-31 +2 month" ) ); // PHP:  2009-03-31
?>

<?php
SELECT DATE_ADD( '2009-01-31', INTERVAL 1 MONTH ); // MySQL:  2009-02-28
?>

Решение:

Лучше было бы использовать другую строку, чем +X month,
Возможно, дата формата мм / дд $i/01 (всегда будет первый день месяца) или используйте mktime,

$time = mktime(0,0,0,$i,1); //seconds, minutes, hours, month, day

Mktime — параметр месяца — Номер месяца относительно конца предыдущего года.
Значения с 1 по 12 указывают на нормальные календарные месяцы года в
вопрос. Значения меньше 1 (включая отрицательные значения) относятся к
месяцев в предыдущем году в обратном порядке, поэтому 0 — декабрь, -1 —
Ноябрь и т. Д. Значения больше 12 ссылаются на соответствующий месяц
в следующем году
.

1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector