需要在日期中添加月数

时间:2012-01-03 07:41:08

标签: php mysql date

我需要一种方法,可以在PHP中的任何日期添加一些月份。我知道如何在MySQL中执行此操作,而不是在PHP中执行此操作。这是我的尝试:

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" 

MySQL输出正确。我在PHP中需要相同的输出。

4 个答案:

答案 0 :(得分:2)

如果您使用PHP5> = 5.3,您只需使用

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

正如其他答案中所建议的那样。但是如果你使用5.2,你可以尝试改变你的代码:

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

我建议将类定义添加到单独的文件中并require_once()。从date_create()切换到使用新类的对象构造函数。新类modify()方法将使用原始给定月份的第一天而不是最后一天修改日期,并检查原始给定日期是否大于新月份的天数。

这种方法的一个好处是它也适用于$date->modify ('2 year 2 month')

答案 1 :(得分:1)

这是一个可能为您完成工作的解决方案:

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

无论您从哪个月开始,这都会有效。

答案 2 :(得分:0)

希望它对你有所帮助。

我只是尝试添加天而不是添加几个月

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

输出:

After adding month: 2012-02-29

答案 3 :(得分:0)

阅读Dagon在您的问题评论中发布的链接。根据那里的答案推断,我尝试了这个并且它有效:

$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