Является ли это ошибкой 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("FY",$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("FY",$month); в 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("FY",$month); 

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

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

 $month = strtotime(date("M-01-Y") . "+".$month_index." month"); 

Это то, как работают даты, и когда вы сталкиваетесь с февралем и 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'); } 

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

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

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

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

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

Даты тяжелые.