(PHP 5 >= 5.3.0)
DateTime::sub — Subtracts an amount of days, months, years, hours, minutes and seconds from a DateTime object
Objektorientierter Stil
Prozeduraler Stil
Subtracts the specified DateInterval object from the specified DateTime object.
Nur bei prozeduralem Aufruf: Ein von date_create() zurückgegebenes DateTime-Objekt. Diese Funktion verändert dieses Objekt.
A DateInterval object
Returns the DateTime object for method chainingIm Fehlerfall wird FALSE zurückgegeben..
Beispiel #1 DateTime::sub() example
Objektorientierter Stil
<?php
$date = new DateTime('2000-01-20');
$date->sub(new DateInterval('P10D'));
echo $date->format('Y-m-d') . "\n";
?>
Prozeduraler Stil
<?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');
?>
The above examples will output:
2000-01-10
Beispiel #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";
?>
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
2000-01-19 13:59:30 1992-08-15 19:56:58
Beispiel #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";
?>
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
2001-03-30 2001-03-02
DateTime::modify() is an alternative when using PHP 5.2.
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.