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

时间:2013-04-16 17:44:15

标签: php

出于某种原因,我无法使用strtotime('+ 1个月)来工作。这是我的代码;

$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

在我的日期添加一个月;

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

然后显示我更改的日期;

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

我遇到的问题是提供的日期;

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

返回;

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

有人可以帮助我吗?

2 个答案:

答案 0 :(得分:2)

它跳到3月是因为今天是1月31日,并且添加了一个月给了2月31日,这是不存在的,所以它正在进入下一个有效日期。这是一个PHP错误。您可以在https://bugs.php.net/bug.php?id=44073

获取更多相关信息

您可以尝试使用DateTime来完成此方案。您可以根据需要使用此功能

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);
}

现在你可以致电:

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

这会给你:

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

希望这可以帮助你:)

答案 1 :(得分:1)

DateTime 更适合处理日期数学,因为它可以解释当月的日子:

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

See it in action

由于您正在使用时间戳,因此它可能如下所示:

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