strtotime +1个月过去一个月

时间:2017-04-21 06:37:55

标签: php date increment strtotime date-range

使用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

2 个答案:

答案 0 :(得分:1)

  

找出月份差异,然后使用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

答案 1 :(得分:1)

我可能(甚至可能)误解了你的问题,但这是我提供答案的答案。

代码:

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