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 — Subtracts an amount of days, months, years, hours, minutes and seconds from a DateTime object
Descrizione
Stile orientato agli oggetti
Stile procedurale
Subtracts the specified DateInterval object from the specified DateTime object.
Elenco dei parametri
-
oggetto -
Solo per lo stile procedurale: Un oggetto DateTime restituito da date_create(). La funzione modifica questo oggetto.
-
interval -
A DateInterval object
Valori restituiti
Restituisce l'oggetto DateTime per il metodo chaining o FALSE in caso di fallimento.
Esempi
Example #1 DateTime::sub() example
Stile orientato agli oggetti
<?php
$date = new DateTime('2000-01-20');
$date->sub(new DateInterval('P10D'));
echo $date->format('Y-m-d') . "\n";
?>
Stile procedurale
<?php
$date = date_create('2000-01-20');
date_sub($date, date_interval_create_from_date_string('10 days'));
echo date_format($date, 'Y-m-d');
?>
I precedenti esempi visualizzeranno:
2000-01-10
Example #2 Further DateTime::sub() examples
<?php
$date = new DateTime('2000-01-20');
$date->sub(new DateInterval('PT10H30S'));
echo $date->format('Y-m-d H:i:s') . "\n";
$date = new DateTime('2000-01-20');
$date->sub(new DateInterval('P7Y5M4DT4H3M2S'));
echo $date->format('Y-m-d H:i:s') . "\n";
?>
Il precedente esempio visualizzerĂ :
2000-01-19 13:59:30 1992-08-15 19:56:58
Example #3 Beware when subtracting months
<?php
$date = new DateTime('2001-04-30');
$interval = new DateInterval('P1M');
$date->sub($interval);
echo $date->format('Y-m-d') . "\n";
$date->sub($interval);
echo $date->format('Y-m-d') . "\n";
?>
Il precedente esempio visualizzerĂ :
2001-03-30 2001-03-02
Note
DateTime::modify() is an alternative when using PHP 5.2.
Vedere anche:
- DateTime::add() - Adds an amount of days, months, years, hours, minutes and seconds to a DateTime object
- DateTime::diff() - Returns the difference between two DateTime objects
- DateTime::modify() - Alters the timestamp
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.
