Last 5.3 release ever available: PHP 5.3.29 - 5.3 now EOL

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

Açıklama

Nesne yönelimli kullanım

public DateTime DateTime::sub ( DateInterval $interval )

Yordamsal kullanım

DateTime date_sub ( DateTime $object , DateInterval $interval )

Subtracts the specified DateInterval object from the specified DateTime object.

Değiştirgeler

nesne

Sadece yordamsal tarz: date_create() tarafından bir DateTime nesnesi döndürülür. İşlev bu nesnede değişiklik yapar.

interval

A DateInterval object

Dönen Değerler

Değişmiş DateTime nesnesinden başarısızlık durumunda FALSE döner.

Örnekler

Örnek 1 DateTime::sub() example

Nesne yönelimli kullanım

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

Yordamsal kullanım

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

Yukarıdaki örneklerin çıktısı:

2000-01-10

Örnek 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";
?>

Yukarıdaki örneğin çıktısı:

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

Örnek 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";
?>

Yukarıdaki örneğin çıktısı:

2001-03-30
2001-03-02

Notlar

DateTime::modify() is an alternative when using PHP 5.2.

Ayrıca Bakınız

  • DateTime::add() - Adds an amount of days, months, years, hours, minutes and seconds to a DateTime object
  • DateTime::diff()
  • DateTime::modify() - Alters the timestamp
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
4 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