©
This document uses PHP Chinese website manual Release
(PHP 5 >= 5.3.0, PHP 7)
DateTime::add -- date_add — Adds an amount of days, months, years, hours, minutes and seconds to a DateTime object
面向对象风格
$interval
)过程化风格
$object
, DateInterval $interval
)Adds the specified DateInterval object to the specified DateTime object.
object
仅过程化风格:由 date_create() 返回的 DateTime 类型的对象。此函数会修改这个对象。
interval
A DateInterval object
返回被修改的 DateTime 对象, 或者在失败时返回 FALSE
.
Example #1 DateTime::add() example
面向对象风格
<?php
$date = new DateTime ( '2000-01-01' );
$date -> add (new DateInterval ( 'P10D' ));
echo $date -> format ( 'Y-m-d' ) . "\n" ;
?>
过程化风格
<?php
$date = date_create ( '2000-01-01' );
date_add ( $date , date_interval_create_from_date_string ( '10 days' ));
echo date_format ( $date , 'Y-m-d' );
?>
以上例程会输出:
2000-01-11
Example #2 Further DateTime::add() examples
<?php
$date = new DateTime ( '2000-01-01' );
$date -> add (new DateInterval ( 'PT10H30S' ));
echo $date -> format ( 'Y-m-d H:i:s' ) . "\n" ;
$date = new DateTime ( '2000-01-01' );
$date -> add (new DateInterval ( 'P7Y5M4DT4H3M2S' ));
echo $date -> format ( 'Y-m-d H:i:s' ) . "\n" ;
?>
以上例程会输出:
2000-01-01 10:00:30 2007-06-05 04:03:02
Example #3 Beware when adding months
<?php
$date = new DateTime ( '2000-12-31' );
$interval = new DateInterval ( 'P1M' );
$date -> add ( $interval );
echo $date -> format ( 'Y-m-d' ) . "\n" ;
$date -> add ( $interval );
echo $date -> format ( 'Y-m-d' ) . "\n" ;
?>
以上例程会输出:
2001-01-31 2001-03-03
DateTime::modify() is an alternative when using PHP 5.2.
[#1] Angelo [2015-11-19 12:28:28]
Another simple solution to adding a month but not autocorrecting days to the next month is this.
(Also works for substracting months)
$dt = new DateTime("2016-01-31");
$oldDay = $dt->format("d");
$dt->add(new DateInterval("P1M")); // 2016-03-02
$newDay = $dt->format("d");
if($oldDay != $newDay) {
// Check if the day is changed, if so we skipped to the next month.
// Substract days to go back to the last day of previous month.
$dt->sub(new DateInterval("P" . $newDay . "D"));
}
echo $dt->format("Y-m-d"); // 2016-02-29
Hope this helps someone.
[#2] Anthony [2015-07-01 10:55:53]
If you're using PHP >= 5.5, instead of using "glavic at gmail dot com"'s DateTimeEnhanced class, use the built in DateTimeImmutable type. When you call DateTimeImmutable::add() it will return a new object, rather than modifying the original
[#3] patrick dot mckay7 at gmail dot com [2014-11-25 16:34:33]
Here is a solution to adding months when you want 2014-10-31 to become 2014-11-30 instead of 2014-12-01.
<?php
class MyDateTime extends DateTime
{
public function addMonth($num = 1)
{
$date = $this->format('Y-n-j');
list($y, $m, $d) = explode('-', $date);
$m += $num;
while ($m > 12)
{
$m -= 12;
$y++;
}
$last_day = date('t', strtotime("$y-$m-1"));
if ($d > $last_day)
{
$d = $last_day;
}
$this->setDate($y, $m, $d);
}
}
?>
[#4] artaxerxes2 at iname dot com [2013-09-18 19:28:33]
Be careful that the internal timer to your DateTime object can be changed drastically when adding even 1 second, during the switch from DST to normal.
Consider the following:
<?php
$ts = 1383458399;
$dst = DateTime::createFromFormat('U',$ts, new DateTimeZone('GMT'));
$dst->setTimeZone(new DateTimeZone('EST5EDT'));
$second = new DateInterval('PT1S');
echo $ts . "\t" . $dst->format("U\tY-m-d H:i:s T") . "\n";
$dst->add($second);
$ts++;
echo $ts . "\t" . $dst->format("U\tY-m-d H:i:s T") . "\n";
?>
[#5] glavic at gmail dot com [2013-09-12 13:06:12]
If you need add() and sub() that don't modify object values, you can create new methods like this:
<?php
class DateTimeEnhanced extends DateTime {
public function returnAdd(DateInterval $interval)
{
$dt = clone $this;
$dt->add($interval);
return $dt;
}
public function returnSub(DateInterval $interval)
{
$dt = clone $this;
$dt->sub($interval);
return $dt;
}
}
$interval = DateInterval::createfromdatestring('+1 day');
$dt = new DateTimeEnhanced; # initialize new object
echo $dt->format(DateTime::W3C) . "\n"; # 2013-09-12T15:01:44+02:00
$dt->add($interval); # this modifies the object values
echo $dt->format(DateTime::W3C) . "\n"; # 2013-09-13T15:01:44+02:00
$dtNew = $dt->returnAdd($interval); # this returns the new modified object and doesn't change original object
echo $dt->format(DateTime::W3C) . "\n"; # 2013-09-13T15:01:44+02:00
echo $dtNew->format(DateTime::W3C) . "\n"; # 2013-09-14T15:01:44+02:00
[#6] Anonymous [2011-02-01 14:16:10]
Note that the add() and sub() methods will modify the value of the object you're calling the method on! This is very untypical for a method that returns a value of its own type. You could misunderstand it that the method would return a new instance with the modified value, but in fact it modifies itself! This is undocumented here. (Only a side note on procedural style mentions it, but it obviously does not apply to object oriented style.)
[#7] fortruth at mabang dot net [2010-08-23 23:00:50]
adding 15 min to a datetime
<?php
$initDate = new DateTime("2010/08/24");
$initDate->add(new DateInterval("PT15M"));
echo $initDate->format("Y/m/d m:i:s");//result: 2010/08/24 08:15:00
?>
period:
P1Y2M3DT1H2M3S
period time:
PT1H2M3S