PHP 5.4.31 Released

DateTime::sub

date_sub

(PHP 5 >= 5.3.0)

DateTime::sub -- date_sub Sustrae una cantidad de días, meses, años, horas, minutos y segundos de un objeto DateTime

Descripción

Estilo orientado a objetos

public DateTime DateTime::sub ( DateInterval $interval )

Estilo por procedimientos

DateTime date_sub ( DateTime $object , DateInterval $interval )

Sustrae el objeto DateInterval especificado del 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::sub()

Estilo orientado a objetos

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

Estilo por procedimientos

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

El resultado de los ejemplos serían:

2000-01-10

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

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

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

El resultado del ejemplo sería:

2000-01-19 13:59:30
1992-08-15 19:56:58

Ejemplo #3 Cuidado al sustraer meses

<?php
$fecha 
= new DateTime('2001-04-30');
$intervalo = new DateInterval('P1M');

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

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

El resultado del ejemplo sería:

2001-03-30
2001-03-02

Notas

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

Ver también

add a note add a note

User Contributed Notes 3 notes

up
4
Anonymous
3 years ago
Note that the sub() and add() 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
1
itonohito
3 months ago
When trying to pass daylight saving state change time, sub() works incorrectly.

$t = new DateTime( '2014-03-30 02:00:00' );
$t->add( new DateInterval('PT1H') );
echo $->format('Y-m-d H:i:s');

output will be: '2014-03-30 04:00:00'.

Well, it's ok because at 3:00 a.m. daylight saving time begins in my country, so after  02:59:59 must be 04:00:00.

But if I try to subtract time:

$t = new DateTime( '2014-03-30 04:00:00' );
$t->sub( new DateInterval('PT1H') );
echo $->format('Y-m-d H:i:s');

output will be: '2014-03-30 04:00:00'.

Yes, completely the same, not '2014-03-30 02:00:00' as it should be.
up
0
php at keith tyler dot com
3 years ago
If you use diff() after sub(), the effects of the sub() will be repeated on the date object.

It doesn't matter if the object is the one diffed or doing the diffing (i.e. which object you call diff() from).

<?php
$today
= new DateTime();
$newdate = new DateTime();

print_r($newdate);
$newdate->sub(new DateInterval("PT1S"));
print_r($newdate);
$s = $newdate->diff($today);
print_r($newdate);
$s = $today->diff($newdate);
print_r($newdate);
$s = $today->diff($newdate);
print_r($newdate);
?>

Prints:

DateTime Object
(
    [date] => 2010-11-30 18:43:48
    [timezone_type] => 3
    [timezone] => America/Los_Angeles
)
DateTime Object
(
    [date] => 2010-11-30 18:43:47
    [timezone_type] => 3
    [timezone] => America/Los_Angeles
)
DateTime Object
(
    [date] => 2010-11-30 18:43:46
    [timezone_type] => 3
    [timezone] => America/Los_Angeles
)
DateTime Object
(
    [date] => 2010-11-30 18:43:45
    [timezone_type] => 3
    [timezone] => America/Los_Angeles
)
DateTime Object
(
    [date] => 2010-11-30 18:43:44
    [timezone_type] => 3
    [timezone] => America/Los_Angeles
)

Note that using add() instead of sub() does NOT have the same effect.

This is particularly undesirable -- in this example you make a datetime, use sub() to make it a relative time in the past, and then date->diff() to confirm the difference. But the diff() inadvertendly makes the difference 2x.
To Top