©
This document uses PHP Chinese website manual Release
(PHP 5 >= 5.2.0, PHP 7)
DateTime::modify -- date_modify — Alters the timestamp
面向对象风格
$modify
)过程化风格
$object
, string $modify
)Alter the timestamp of a DateTime object by incrementing or decrementing in a format accepted by strtotime() .
object
仅过程化风格:由 date_create() 返回的 DateTime 类型的对象。此函数会修改这个对象。
modify
日期/时间字符串。正确格式的说明详见 日期与时间格式。
返回被修改的 DateTime 对象, 或者在失败时返回 FALSE
.
版本 | 说明 |
---|---|
5.3.6 | Absolute date/time statements now take effect. Previously, only relative parts were used. |
5.3.0 | 将返回值从 NULL 改为 DateTime 类型。 |
Example #1 DateTime::modify() example
面向对象风格
<?php
$date = new DateTime ( '2006-12-12' );
$date -> modify ( '+1 day' );
echo $date -> format ( 'Y-m-d' );
?>
过程化风格
<?php
$date = date_create ( '2006-12-12' );
date_modify ( $date , '+1 day' );
echo date_format ( $date , 'Y-m-d' );
?>
以上例程会输出:
2006-12-13
Example #2 Beware when adding or subtracting months
<?php
$date = new DateTime ( '2000-12-31' );
$date -> modify ( '+1 month' );
echo $date -> format ( 'Y-m-d' ) . "\n" ;
$date -> modify ( '+1 month' );
echo $date -> format ( 'Y-m-d' ) . "\n" ;
?>
以上例程会输出:
2001-01-31 2001-03-03
[#1] www dot wesley at gmail dot com [2015-07-04 20:31:31]
This is an improvement of @jenspj's answer
<?php
$d = new DateTime('2007-12-31');
function addMonths($date, $months)
{
$years = floor(abs($months / 12));
$leap = 29 <= $date->format('d');
$m = 12 * (0 <= $months?1:-1);
for ($a = 1;$a < $years;++$a) {
$date = addMonths($date, $m);
}
$months -= ($a - 1) * $m;
$init = clone $date;
if (0 != $months) {
$modifier = $months . ' months';
$date->modify($modifier);
if ($date->format('m') % 12 != (12 + $months + $init->format('m')) % 12) {
$day = $date->format('d');
$init->modify("-{$day} days");
}
$init->modify($modifier);
}
$y = $init->format('Y');
if ($leap && ($y % 4) == 0 && ($y % 100) != 0 && 28 == $init->format('d')) {
$init->modify('+1 day');
}
return $init;
}
function addYears($date, $years)
{
return addMonths($date, 12 * $years);
}
echo $d->format('F j,Y') . ' N<br />';
$d = addMonths($d, +1);
echo $d->format('F j,Y') . ' +1M<br />';
$d = addMonths($d, +1);
echo $d->format('F j,Y') . ' +1M<br />';
$d = addYears($d, +60);
echo $d->format('F j,Y') . ' +60Y<br />';
$d = addYears($d, -59);
echo $d->format('F j,Y') . ' -59Y<br />';
[#2] 66Ton99 [2014-05-13 15:31:46]
Extension for DateTime class which solves problem of adding or subtracting months
https://gist.github.com/66Ton99/60571ee49bf1906aaa1c
[#3] admin at wmfoi dot com dot br [2014-04-08 20:22:00]
The changelog says: "5.3.0 - Changed the return value on success from NULL to DateTime".
That means that you can't do a Fluid Interface design with it in PHP 5.2.
In other words, this will not work in 5.2:
<?php
$DateTime=new DateTime();
echo $DateTime->modify('+1 day')->format('d');
?>
[#4] jay dot removethis at grooveshark dot com [2013-10-29 05:46:44]
Due to DST and the way DateTime internally handles dates, it's possible to get stuck in a time loop.
For example:
<?php
$dt = new DateTime('2012-03-11 3:00AM');
echo $dt->format('YmdH') . "\n";
$dt->modify("-1 hour");
echo $dt->format('YmdH') . "\n";
$dt->modify("-1 hour");
echo $dt->format('YmdH') . "\n";
?>
prints out:
2012031103
2012031103
2012031103
if your timezone is set to America/New_York.
[#5] php at lanar dot com dot au [2013-10-26 06:50:21]
modify() ignores any timezone information in the data while the DateTime constructor does not.
$dt = new DateTime( '2013-10-26T11:00:00+11:00' )
will create a +11 timezone while
$dt->modify( '2013-10-26T11:00:00+02:00' )
does not change the timezone or the time.
<?php
$dt = new DateTime( '2013-10-26T15:00:00Australia/Melbourne' ) ;
echo "\n", $dt->format( "c" ) ;
echo "\nTimezone '", $dt->getTimezone()->getName() . "'." ;
// modify $dt to 1 am new york which is 3 pm melbourne
$dt->modify( '2013-10-26T01:00:00America/New_York' ) ;
// result is 1 am melbourne time, not 3 pm
echo "\n", $dt->format( "c" ) ;
echo "\nTimezone '", $dt->getTimezone()->getName() . "'." ;
?>
Output
2013-10-26T15:00:00+11:00
Timezone 'Australia/Melbourne'.
2013-10-26T01:00:00+11:00
Timezone 'Australia/Melbourne'.
[#6] Jenny jsimonds@atomic jet packs dot com [2012-04-15 21:04:34]
Note: This method modifies the object in-place. So if you want to calculate a new date but assign the new value to a different object, this will NOT work:
<?php
$numMinutes = 25;
$oDateA = new DateTime('2012-01-01 12:00:00');
print "
Original:<br>
oDateA = {$oDateA->format('Y-m-d H-i-s')}<br>
";
$oDateB = $oDateA->modify ("+{$numMinutes} minutes");
print "
plus {$numMinutes} minutes:<br>
oDateA = {$oDateA->format('Y-m-d H-i-s')}<br>
oDateB = {$oDateB->format('Y-m-d H-i-s')}<br>
";
?>
...produces this:
oDateA = 2012-01-01 12-00-00
plus 25 minutes:
oDateA = 2012-01-01 12-25-00
oDateB = 2012-01-01 12-25-00
Use something like this instead:
<?php
$numMinutes = 25;
$oDateA = new DateTime('2012-01-01 12:00:00');
print "
<p>
Original:<br>
oDateA = {$oDateA->format('Y-m-d H-i-s')}<br>
";
$oDateB = clone $oDateA;
$oDateB->modify ("+{$numMinutes} minutes");
print "
plus {$numMinutes} minutes:<br>
oDateA = {$oDateA->format('Y-m-d H-i-s')}<br>
oDateB = {$oDateB->format('Y-m-d H-i-s')}<br>
";
?>
... produces this:
oDateA = 2012-01-01 12-00-00
plus 25 minutes:
oDateA = 2012-01-01 12-00-00
oDateB = 2012-01-01 12-25-00
[#7] jenspj at msn dot com [2012-02-20 14:34:55]
These functions makes sure that adding months or years always ends up in the month you would expect. Works for positive and negative values
<?php
$date=new DateTime();
$date->setDate(2008,2,29);
function addMonths($date,$months){
$init=clone $date;
$modifier=$months.' months';
$back_modifier =-$months.' months';
$date->modify($modifier);
$back_to_init= clone $date;
$back_to_init->modify($back_modifier);
while($init->format('m')!=$back_to_init->format('m')){
$date->modify('-1 day') ;
$back_to_init= clone $date;
$back_to_init->modify($back_modifier);
}
}
function addYears($date,$years){
$init=clone $date;
$modifier=$years.' years';
$date->modify($modifier);
while($date->format('m')!=$init->format('m'))
$date->modify('-1 day');
}
addMonths($date,-1);
addYears($date,3);
echo $date->format('F j,Y');
?>