文字

DateTime::add

date_add

(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

说明

面向对象风格

public DateTime DateTime::add ( DateInterval $interval )

过程化风格

DateTime date_add ( DateTime $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.

参见

  • DateTime::sub() - Subtracts an amount of days, months, years, hours, minutes and seconds from a DateTime object
  • DateTime::diff() - Returns the difference between two DateTime objects
  • DateTime::modify() - Alters the timestamp

用户评论:

[#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

上一篇: 下一篇: