修复添加月份php时的年度飞跃错误

时间:2015-09-09 13:25:23

标签: php date datetime leap-year

当datetime对象具有日期' 2012-01-30'时,我们有以下对象:

object(DateTime)#1233 (3) {
  ["date"]=>
  string(19) "2012-01-30 00:00:00"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(9) "ETC/GMT+3"
}

但是,当添加一个月时:

$date->add(new DateInterval('P1M'));

它将产生以下对象:

object(DateTime)#1233 (3) {
  ["date"]=>
  string(19) "2012-03-01 00:00:00"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(9) "ETC/GMT+3"
}

它应该添加一个月,因此要显示的日期应该是 ' 2012-02-28',因此2012年2月,而不是2012年3月。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

试试这个

function add($date_str, $months)
{
    $date = new DateTime($date_str);
    $start_day = $date->format('j');

    $date->modify("+{$months} month");
    $end_day = $date->format('j');

    if ($start_day != $end_day)
        $date->modify('last day of last month');

    return $date;
}

$result = add('2011-01-31', 1);  // 2011-02-28