Месяцы не отображаются корректно с помощью php

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

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

Мой код:

<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)

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

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

Мы в конце месяца (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> 

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

 <?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 …

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

Учитывая следующий комментарий руководства PHP:

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

 <?php echo date( "Ymd", strtotime( "2009-01-31 +1 month" ) ); // PHP: 2009-03-03 echo date( "Ymd", 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 . Возможно, дата формата mm / dd $i/01 (всегда есть первый день месяца) или использование mktime .

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

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