Это ошибка PHP date() или что-то не так с моим кодом?


У меня есть два изображения стрелки, одно из которых увеличивает месяц назад, другое увеличивает его вперед с помощью href.

if (ISSET($_GET["month"])){
    $month_index = $_GET["month"];
}
else{
    $month_index = 0;
}
$month = strtotime("+".$month_index." month");
?>
...

<a href=<?php $month_index = $month_index - 1; echo "?month=".$month_index; ?>><img src="arrow_left.gif" ></a>
<div class="title">Logbook Calendar for <?php echo date("F Y",$month); ?> </div>
<a href=<?php $month_index = $month_index + 2; echo "?month=".$month_index; ?>><img src="arrow_right.gif"></a>

Проблема в том, что когда наступает февраль 2015 года, date() возвращает "Март 2015" - так что $month_index = 6 и $month_index =7 являются мартом.

Я запустил этот код на http://writecodeonline.com/php/:

date_default_timezone_set("America/New_York");
$month_index = 6;
$month_index = $month_index - 1;
$month_index = $month_index + 2; 
echo $month_index;
$month = strtotime("+".$month_index." month");
echo " " . $month;
echo " " . date("F Y",$month);

Переключение $month_index=6 на $month_index=7 по-прежнему приводит к повторению марта. Есть ли здесь просто какая-то ошибка, где Февраль, 2015 неужели... ушел?

Обновление: Всем спасибо. Я бы никогда не нашел этого сам. Я решил проблему следующим образом:

$month = strtotime(date("M-01-Y") . "+".$month_index." month");
Author: AmagicalFishy, 2014-07-29

2 answers

Так работают даты и когда вы сталкиваетесь с февралем и 29-м днем месяца или позже. Когда вы добавляете месяц к дате после последнего дня февраля этого года (т. е. 28 февраля этого года), вы пропустите февраль. Всякий раз, когда вы повторяете месяцы, вы всегда должны работать с началом месяца, чтобы избежать пропуска февраля. Поэтому, если вы начнете с 30 января и добавите "один месяц", так как 30 февраля нет, вы перейдете к марту.

Вот как вы можно перебирать месяцы, не зная, сколько дней в феврале (или не заботясь об этом). Я выбрал произвольную дату окончания через год.

$start    = new DateTimeImmutable('@'.mktime(0, 0, 0, $month_index, 1, 2014));
$end      = $start->modify('+1 year')
$interval = new DateInterval('P1M');
$period   = new DatePeriod($start, $interval, $end);

foreach ($period as $dt) {
    echo $dt->format('F Y');
}
 6
Author: John Conde, 2014-07-29 18:43:47

В 2015 году нет 29 февраля.

Просто добавляя или вычитая целые месяцы за раз, вы создаете новые даты в один и тот же день в запрошенном месяце. В этом случае вы заставили PHP попытаться установить дату 29 февраля 2015 года. Он автоматически перенесся на 1 марта 2015 года.

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

date("F y", mktime(0,0,0, $month_index, 1, 2015));

Хорошо, что вы пишете этот код и обнаружили ошибку сегодня, иначе у вас была бы ошибка это появлялось только 29 (или 31) числа каждого месяца (кроме високосных лет)!

Свидания - это трудно.

 5
Author: akatakritos, 2014-07-29 18:38:06