Мне интересно, что я делаю не так?
Я создаю цикл 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)
Есть отзывы? Это что-то с моим кодом? Потому что я не могу найти никаких ошибок
Мы находимся в конце месяца (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( "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 ссылаются на соответствующий месяц
в следующем году.