文字

DateTime::sub

date_sub

(PHP 5 >= 5.3.0, PHP 7)

DateTime::sub -- date_sub Subtracts an amount of days, months, years, hours, minutes and seconds from a DateTime object

说明

面向对象风格

public DateTime DateTime::sub ( DateInterval $interval )

过程化风格

DateTime date_sub ( DateTime $object , DateInterval $interval )

Subtracts the specified DateInterval object from the specified DateTime object.

参数

object

仅过程化风格:由 date_create() 返回的 DateTime 类型的对象。此函数会修改这个对象。

interval

A DateInterval object

返回值

返回被修改的 DateTime 对象, 或者在失败时返回 FALSE .

范例

Example #1 DateTime::sub() example

面向对象风格

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

过程化风格

<?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' );
?>

以上例程会输出:

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

以上例程会输出:

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

以上例程会输出:

2001-03-30
2001-03-02

注释

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

参见

  • 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

用户评论:

[#1] soerenklein98 at gmail dot com [2015-09-16 18:17:51]

Keep in mind that this method can work incorrectly when the daylight saving time is changing to wintertime.
An example is when you have got a loop and your subtracting 1 hour from your time in it. On one day you are actually subtracting 1 hour and the computer adds 1 - the infinitive loop is created.
And on the other day you would actually subtract 2 hours.

[#2] itonohito [2014-04-05 19:25:11]

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.

[#3] Anonymous [2011-02-01 14:15:05]

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.)

[#4] php at keith tyler dot com [2010-11-30 18:53:18]

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.

上一篇: 下一篇: