Поскольку эта тема кажется довольно запутанной, вот некоторая информация по ней:
Вы на самом деле получаете точный результат, буквально увеличивая месяц на 1, день остается 31, поэтому дата 2011-06-31. Если вы сделаете echo date('Y-m-d', strtotime('2011-06-31'));
, вы увидите, что отображается 2011-07-01
.
Вот один из способов сделать эту работу "ожидаемой" в PHP 5.1 (и ранее)
function next_month($timestamp)
{
$next_month = date('m', $timestamp);
$next_month++;
$next_year = date('Y', $timestamp);
if($next_month == 12)
{
$next_year++;
}
if(date('d', $timestamp) <= date('t', mktime(0, 0, 0, $next_month, 1, $next_year)))
{
return date('Y-m-d',strtotime( '+1 month', $timestamp));
}
else
{
return date('Y-m-d', mktime(0, 0, 0, $next_month, date('t', mktime(0, 0, 0, $next_month, 1, $next_year)), $next_year));
}
}
echo next_month(strtotime('2011-05-31'));
echo next_month(strtotime('2011-05-01'));
Это модифицированный код из библиотеки, которую я написал недавно - я никогда не находил элегантного решения.
Для PHP 5.3 +
См. PHP DateTime :: изменение сложения и вычитания месяцев для подробных вопросов и ответов по этой теме.