Когда используешь strtotime()
добавить один месяц, это дает мне неправильный вывод в состоянии, где я поставил дату «2017-01-30»
function date_diff($min,$max)
{
$d1 = strtotime($min);
$d2 = strtotime($max);
$min_date = min($d1, $d2);
$max_date = max($d1, $d2);
$count=$i = 0;
while (($min_date = strtotime("+1 MONTH", $min_date)) <= $max_date)
{
echo "<br/>";
echo date('Y-m-d',$min_date)."--------".date("Y-m-d",$max_date);
}
}
Я вызываю функцию с такими датами:
date_diff("2016/12/30","2017/07/30");
Вывод функции выше:
2017-01-30--------2017-07-30
2017-03-02--------2017-07-30 // wrong calculation on this line
2017-04-02--------2017-07-30
2017-05-02--------2017-07-30
2017-06-02--------2017-07-30
2017-07-02--------2017-07-30
Ожидаемый результат
2017-01-31--------2017-07-30
2017-02-28--------2017-07-30
2017-03-31--------2017-07-30
2017-04-30--------2017-07-30
2017-05-31--------2017-07-30
2017-06-30--------2017-07-30
Возможно (вероятно, даже), что я неправильно понимаю ваш вопрос, но вот мой шанс дать ответ.
Код:
function date_func($d1,$d2){
$min=date("Y-m-t",strtotime(min([$d1,$d2]))); // always the last day of the month
$max=date("Y-m-d",strtotime(max([$d1,$d2])));
$month_count=0;
while(($min=date("Y-m-t",strtotime("$min +1 day")))<$max){
++$month_count;
echo "$min--------$max\n";
}
echo "Month Count: $month_count\n"; // I assume you only want the count at the end
}
date_func("2016/12/30","2017/07/30"); // I had to rename your function to avoid an error
Выход:
2017-01-31--------2017-07-30
2017-02-28--------2017-07-30
2017-03-31--------2017-07-30
2017-04-30--------2017-07-30
2017-05-31--------2017-07-30
2017-06-30--------2017-07-30
Month Count: 6
Найди разницу в месяце и используй mktime
$min="2016/12/30";
$max="2017/07/30";
$ts1 = strtotime($max);
$ts2 = strtotime($min);
$year1 = date('Y', $ts1);
$year2 = date('Y', $ts2);
$month1 = date('m', $ts1);
$month2 = date('m', $ts2);
$diff = (($year1 - $year2) * 12) + ($month1 - $month2);
for ($i = 1; $i < $diff; $i++)
{
$last_day=date('m-t-Y', strtotime(date('Y-m-d', mktime(0, 0, 0, $i, 1, $year1))));
echo $last_day."--------".date('Y-m-d',$ts1);
echo "<br>";
}
Выход
01-31-2017--------2017-07-30
02-28-2017--------2017-07-30
03-31-2017--------2017-07-30
04-30-2017--------2017-07-30
05-31-2017--------2017-07-30
06-30-2017--------2017-07-30