向Unix时间戳添加1个月的问题

For some reason, I cannot get strtotime('+1 month) to work. Here is my code;

$Date   = $_REQUEST['date']; //This is a unix time stamp
$Start  = $_REQUEST['start']; //This is a unix time stamp
$End    = $_REQUEST['end']; //This is a unix time stamp

to add a month onto my dates;

$monStart =strtotime('+1 month', $Start);
$monEnd   =strtotime('+1 month', $End);
$monDate  =strtotime('+1 month', $Date);

then to show my changed dates;

$vEnd = date('m/d/Y', $monEnd);
$vStart = date('m/d/Y', $monStart);
$vDate = date('m/d/Y', $monDate);

The problem that I have is that the supplied dates;

$Date = 1/31/2013
$Start = 1/01/2013
$End = 1/31/2013

Return;

$vDate = 3/03/2013
$vStart = 2/01/2013 //Only correct one
$vEnd = 3/03/2013

Please can someone help me?

DateTime is much better for handling date math as it account for things like days in the month:

$dt = new DateTime('2013-02-01');
$dt->modify('+1 month');
echo $dt->format('Y-m-d');

See it in action

Since you're using timestamps it might look like this:

$dt = new DateTime('@'.$_REQUEST['start']);
$dt->modify('+1 month');
echo $dt->format('m/d/Y');

It's jumping to March because today is 31sth Jan, and adding a month gives 31st Feb, which doesn't exist, so it's moving to the next valid date. This is a PHP bug. You can get more info on that at https://bugs.php.net/bug.php?id=44073

You can try with DateTime to over come this scenario. You can use this function for your requirement

function add_month($date_value, $months, $format = 'm/d/Y') {
    $date = new DateTime($date_value);
    $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->format($format);
}

Now you can call :

$vEnd = add_month($monEnd, 1);
$vStart = add_month($monStart, 1);
$vDate = add_month($monDate, 1); 

This will give you :

$vDate = '02/28/2013';
$vStart = '02/01/2013';
$vEnd = '02/28/2013';

Hope this helps you :)