PHP:将日期添加到日期,但不超过该月的最后一天

Geo*_*ock 33 php date

希望创建一个在PHP中执行此操作的函数.

我需要在一个日期添加几个月,但不要超过该月的最后一天.

例如:

Add 1 month to January (1-28th), 2011, should produce February (1-28th), 2011.
Add 1 month to January 30th, 2011, should produce February 28th, 2011.
Add 3 months to January 31st, 2011, should produce April 30th, 2011.
Add 13 months to January 30th, 2011, should produce February 29th, 2012.
Add 1 month to October 31st, 2011, should produce November 30th, 2011.
Run Code Online (Sandbox Code Playgroud)

如果我在PHP中使用日期添加,我会超支:

Adding 1 month to January 30th, 2011, results in March 2nd, 2011.
Run Code Online (Sandbox Code Playgroud)

我的规范不允许我超越新的一个月.

实现这一目标的最简单方法是什么?

Cre*_*ing 42

您可以比较添加1个月之前和之后的月份日期.如果不一样,那么你下个月就会超过.

function add($date_str, $months)
{
    $date = new DateTime($date_str);

    // We extract the day of the month as $start_day
    $start_day = $date->format('j');

    // We add 1 month to the given date
    $date->modify("+{$months} month");

    // We extract the day of the month again so we can compare
    $end_day = $date->format('j');

    if ($start_day != $end_day)
    {
        // The day of the month isn't the same anymore, so we correct the date
        $date->modify('last day of last month');
    }

    return $date;
}

$result = add('2011-01-28', 1);   // 2011-02-28
$result = add('2011-01-31', 3);   // 2011-04-30
$result = add('2011-01-30', 13);  // 2012-02-29
$result = add('2011-10-31', 1);   // 2011-11-30
$result = add('2011-12-30', 1);   // 2011-02-28
Run Code Online (Sandbox Code Playgroud)