Thambuleena
Thambuleena

Reputation: 253

Need to add number of months in date

I need a method for adding some number of months to any date in PHP. I know how to do this in MySQL but not in PHP. Here's my attempt:

MySQL:

    SELECT DATE_ADD( '2011-12-29', INTERVAL 2
    MONTH ) // Output "2012-02-29"

    SELECT DATE_ADD( '2011-12-30', INTERVAL 2
    MONTH )  // output "2012-02-29"

    SELECT DATE_ADD( '2011-12-31', INTERVAL 2
    MONTH )  // output "2012-02-29"

PHP:

    $date = date_create('2011-12-29');
    $date->modify("+1 month");
    echo $date->format("Y-m-d");
    // Output is "2012-01-29" -- this is correct 

    $date = date_create('2011-12-30');
    $date->modify("+2 month");
    echo $date->format("Y-m-d");
    // Output is "2012-03-01" -- I need the answer like "2012-02-29" 

    $date = date_create('2011-12-31');
    $date->modify("+2 month");
    echo $date->format("Y-m-d");
    // Output is "2012-03-02" -- I need the answer like "2012-02-29" 

The MySQL output is correct. I need the same output in PHP.

Upvotes: 1

Views: 502

Answers (4)

zrvan
zrvan

Reputation: 7743

If you use PHP5 >= 5.3, all you need to do is use

$date->modify("last day of +2 months");

as suggested in other answers. But if you use 5.2 you could try altering your code like this:

Class DateTimeM Extends DateTime
{
    public function modify ($modify)
    {
            $day = $this->format ('d');
            $buf = new DateTime ($this->format ('Y-m-01\TH:i:sO'));
            $buf->modify ($modify);
            if ($day > $buf->format ('t'))
            {
                    $this->setDate ($buf->format ('Y'), $buf->format ('m'), $buf->format ('t'));
            }
            else
            {
                    $this->setDate ($buf->format ('Y'), $buf->format ('m'), $day);
            }
            $this->setTime ($buf->format ('H'), $buf->format ('i'), $buf->format ('s'));

            return $this;
      }
}

$date = new DateTimeM ('2011-12-29');
$date->modify("+2 month");
echo $date->format("Y-m-d");

I suggest adding the class definition to a separate file and require_once() it. Switch from date_create() to using the new class's object constructor. The new class's modify() method will modify the date using the first day of the original given month instead of the last and check if the original given day of month is larger than the new month's number of days.

A benefit of this approach is that it will work for say $date->modify ('2 year 2 month') as well.

Upvotes: 2

cmbuckley
cmbuckley

Reputation: 42458

Here's a solution that might do the job for you:

function addMonths(DateTime $date, $months) {
    $last = clone $date;
    $last = $last->modify("last day of +$months months")->getTimestamp();

    $default = clone $date;
    $default = $default->modify("+$months months")->getTimestamp();

    return $date->setTimestamp(min($last, $default));
}

$date = new DateTime('2011-12-31');
$laterDate = addMonths($date, 2);

This will work regardless of which day of the month you start with.

Upvotes: 1

WWW
WWW

Reputation: 9860

Read the link Dagon posted in the comments to your question. Extrapolating on the answer there, I tried this and it works:

$d = new DateTime("2011-12-31");
$d->modify("last day of +2 months");
echo $d->format("Y-m-d");
// result is 2012-02-29

$d = new DateTime("2012-12-31");
$d->modify("last day of +2 months");
echo $d->format("Y-m-d");
// result is 2013-02-28

Upvotes: 0

Muthu Krishnan
Muthu Krishnan

Reputation: 1658

Hope it surely helps you.

I just try with adding days instead of adding months

$MonthAdded = strtotime("+60 days",strtotime('2011-12-31'));
echo "After adding month: ".date('Y-m-d', $MonthAdded)."<br>";

Output:

After adding month: 2012-02-29

Upvotes: 0

Related Questions