我需要一种方法,可以在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中需要相同的输出。
答案 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