Это ошибка 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");
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');
}
В 2015 году нет 29 февраля.
Просто добавляя или вычитая целые месяцы за раз, вы создаете новые даты в один и тот же день в запрошенном месяце. В этом случае вы заставили PHP попытаться установить дату 29 февраля 2015 года. Он автоматически перенесся на 1 марта 2015 года.
Если вас интересуют только месяцы, создавайте даты первого числа каждого месяца:
date("F y", mktime(0,0,0, $month_index, 1, 2015));
Хорошо, что вы пишете этот код и обнаружили ошибку сегодня, иначе у вас была бы ошибка это появлялось только 29 (или 31) числа каждого месяца (кроме високосных лет)!
Свидания - это трудно.