PHP 5.4.36 Released

DateTime::add

date_add

(PHP 5 >= 5.3.0)

DateTime::add -- date_add Ajoute une durée à un objet DateTime

Description

Style orienté objet

public DateTime DateTime::add ( DateInterval $interval )

Style procédural

DateTime date_add ( DateTime $object , DateInterval $interval )

Ajoute la durée de l'objet DateInterval à l'objet DateTime.

Liste de paramètres

object

Style procédural uniquement : Un objet DateTime retourné par la fonction date_create(). Cette fonction modifie cet objet.

interval

Un objet DateInterval

Valeurs de retour

Retourne l'objet DateTime pour chainer les méthodes ou FALSE si une erreur survient.

Exemples

Exemple #1 Exemple avec DateTime::add()

Style orienté objet

<?php
$date 
= new DateTime('2000-01-01');
$date->add(new DateInterval('P10D'));
echo 
$date->format('Y-m-d') . "\n";
?>

Style procédural

<?php
$date 
date_create('2000-01-01');
date_add($datedate_interval_create_from_date_string('10 days'));
echo 
date_format($date'Y-m-d');
?>

Les exemples ci-dessus vont afficher :

2000-01-11

Exemple #2 Autres exemples avec DateTime::add()

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

L'exemple ci-dessus va afficher :

2000-01-01 10:00:30
2007-06-05 04:03:02

Exemple #3 Attention à l'ajout de mois

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

L'exemple ci-dessus va afficher :

2001-01-31
2001-03-03

Notes

DateTime::modify() est une alternative pouvant être utilisée avec PHP 5.2.

Voir aussi

add a note add a note

User Contributed Notes 5 notes

up
43
Anonymous
3 years ago
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.)
up
13
glavic at gmail dot com
1 year ago
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
up
2
artaxerxes2 at iname dot com
1 year ago
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; /* 2013-11-03 01:59:59 in Eastern Saving Time */
$dst = DateTime::createFromFormat('U',$ts, new DateTimeZone('GMT')); /* timezone is ignored for a unix timestamp, but if we don't put it, php throws warnings */
$dst->setTimeZone(new DateTimeZone('EST5EDT')); /* a timezone effectuating the change */
$second = new DateInterval('PT1S'); /* one second */

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

/* results:
1383458399    1383458399    2013-11-03 01:59:59 EDT
1383458400    1383462000    2013-11-03 02:00:00 EST

noticed how the second column went from 1383458399 to 1383462000 even though only 1 second was added?
*/

?>
up
1
patrick dot mckay7 at gmail dot com
24 days ago
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 to include a sensible addMonth method.
*
* This class provides a method that will increment the month, and
* if the day is greater than the last day in the new month, it
* changes the day to the last day of that month. For example,
* If you add one month to 2014-10-31 using DateTime::add, the
* result is 2014-12-01. Using MyDateTime::addMonth the result is
* 2014-11-30.
*/
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);
    }

}

?>
up
-5
fortruth at mabang dot net
4 years ago
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
To Top