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.)
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
Estilo por procedimientos
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($fecha, date_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
- DateTime::add() - Añade una cantidad de días, meses, años, horas, minutos y segundos al objeto DateTime
- DateTime::diff() - Returns the difference between two DateTime objects
- DateTime::modify() - Altera la marca de tiempo
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.
