文字

DateTime::modify

date_modify

(PHP 5 >= 5.2.0, PHP 7)

DateTime::modify -- date_modifyAlters the timestamp

说明

面向对象风格

public DateTime DateTime::modify ( string $modify )

过程化风格

DateTime date_modify ( DateTime $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

参见

  • strtotime() - 将任何英文文本的日期时间描述解析为 Unix 时间戳
  • DateTime::add() - Adds an amount of days, months, years, hours, minutes and seconds to a DateTime object
  • DateTime::sub() - Subtracts an amount of days, months, years, hours, minutes and seconds from a DateTime object
  • DateTime::setDate() - Sets the date
  • DateTime::setISODate() - Sets the ISO date
  • DateTime::setTime() - Sets the time
  • DateTime::setTimestamp() - Sets the date and time based on an Unix timestamp

用户评论:

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

上一篇: 下一篇: