PHP 5.4.36 Released

DateTime::add

date_add

(PHP 5 >= 5.3.0)

DateTime::add -- date_add Añade una cantidad de días, meses, años, horas, minutos y segundos al objeto DateTime

Descripción

Estilo orientado a objetos

public DateTime DateTime::add ( DateInterval $interval )

Estilo por procedimientos

DateTime date_add ( DateTime $object , DateInterval $interval )

Añade el objeto DateInterval especificado al objeto DateTime especificado.

Parámetros

object

Estilo por procesos solamente: Un objeto DateTime devuelto por date_create(). La función modifica este objeto.

interval

Un objeto DateInterval

Valores devueltos

Devuelve el objecto DateTime por el método encadenado o FALSE en caso de error.

Ejemplos

Ejemplo #1 Ejemplo de DateTime::add()

Estilo orientado a objetos

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

Estilo por procedimientos

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

El resultado de los ejemplos serían:

2000-01-11

Ejemplo #2 Más ejemplos de DateTime::add()

<?php
$fecha
= new DateTime('2000-01-01');
$fecha->add(new DateInterval('PT10H30S'));
echo 
$date->format('Y-m-d H:i:s') . "\n";

$fecha = new DateTime('2000-01-01');
$fecha->add(new DateInterval('P7Y5M4DT4H3M2S'));
echo 
$fecha->format('Y-m-d H:i:s') . "\n";
?>

El resultado del ejemplo sería:

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

Ejemplo #3 Cuidado al añadir meses

<?php
$fecha 
= new DateTime('2000-12-31');
$intervalo = new DateInterval('P1M');

$fecha->add($intervalo);
echo 
$fecha->format('Y-m-d') . "\n";

$fecha->add($intervalo);
echo 
$fecha->format('Y-m-d') . "\n";
?>

El resultado del ejemplo sería:

2001-01-31
2001-03-03

Notas

DateTime::modify() es una alternativa cuando se usa PHP 5.2.

Ver también

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