date_add

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

date_add别名 DateTime::add()

说明

此函数是该函数的别名: DateTime::add()

User Contributed Notes

antony at harrisretail dot co dot uk 15-Apr-2014 12:09
When using DateTime::add() be careful that additions over Summertime changes will not always produce the expected results.  For instance, adding a day (interval = P1D) is probably expected to keep the same time when added to a date even over a summertime change. But adding 24 hours (interval = PT24H) does not seem to take into effect the time change.

When then checking the time difference after adding 24 hours after the clocks went forward, the time difference is only 23 hours.

<?php
date_default_timezone_set
('Europe/London');

$diff1Day = new DateInterval('P1D');
$diff24Hours = new DateInterval('PT24H');
$diff1440Minutes = new DateInterval('PT1440M');

// Clocks changed at 2014-03-30 02:00:00

$d0 = new DateTime('2014-03-29 08:00:00');

$d1 = new DateTime('2014-03-29 08:00:00');
// Add 1 day - expect time to remain at 08:00
$d1->add($diff1Day);
print_r($d1);

$d2 = new DateTime('2014-03-29 08:00:00');
// Add 24 hours - expect time to be 09:00
$d2->add($diff24Hours);
print_r($d2);

$seconds = $d1->getTimestamp() - $d0->getTimestamp();
echo
"Difference in Hours: " . $seconds / (60 * 60) . "\n";
detain at interserver dot net 18-Aug-2013 05:41
<?php
function mysql_date_add($now = null, $adjustment )
{     
       
// normal mysql format is:   date_add(now(), INTERVAL 1 MONTH)
        // its close to the strtotime() format, but we need to make a few adjustments
        // first we lowercase everything, not sure if this is needed but it seems
        // to be both mysql conventions to be capitalized and php to lowercase this, so
        // i follow suit.
       
$adjustment = strtolower($adjustment);
       
// next we want to get rid of the INTERVAL part, as neither it nor a corrisponding
        // keyword used in the strtotime() function.   remmeber its lowercase now.
       
$adjustment = str_replace('interval', '', $adjustment);
       
// now the adjustment is suppsoed to have a + or - next to it to indicate direction
        // since strtotime() can be used to go both ways.  We want to tack this one, but first
        // strip any white space off the begining of the $adjustment so we dont wind up with like
        //  +     1         when we need    +1
       
$adjustment = '+' . trim($adjustment);
       
// we should now be left with something like '+1 month'  which is valid strtotime() syntax!
        // next we need to handle the $now, normally people would pass now() if they want the current
        // time or a datetime/timestamp.    We will need to account for this as well, we also
        // want to make use of having a default to now() type of behavior.    we want to also
        // trim and lowercase what they send us just to make it easier to compair to
       
if (is_null($now) || strtolower(trim($now)) == 'now()')
        {
               
// defaulted to or requested a the current time
               
$now = time();
        }
        else
        {
               
// here we are splitting out each part of the mysql timestamp , and storing it in the $parts array
                
preg_match('/([0-9]{4})-([0-9]{2})-([0-9]{2}) ([0-9]{2}):([0-9]{2}):([0-9]{2})/', $now, $parts);
               
// now we use each of the parts to generate a timestamp from it
               
$now = mktime($parts[4], $parts[5], $parts[6], $parts[2], $parts[3], $parts[1]);
        }
       
// now we finally call strtotime() with the properly formatted text and get the date/time
        // calculates done.  I specify its returned as an integer to make things play more nicely
        // with eachother in case the conversion fails.
       
$timestamp = (integer)strtotime($adjustment, $now);
       
// finally we have the timestamp of the adjusted date nowe we just convert it back to the mysql
        // format and send it back to them.
       
return date('Y-m-d H:i:s', $timestamp);
}
?>
lanlife4real 10-Jan-2010 03:19
This function allows the addition of day(s),month(s),year(s) to the original date while still preserving the Hours, minutes and seconds
You can also modify to add to hours, miuntes and even seconds.
 
<?php
function add_date($givendate,$day=0,$mth=0,$yr=0) {
     
$cd = strtotime($givendate);
     
$newdate = date('Y-m-d h:i:s', mktime(date('h',$cd),
   
date('i',$cd), date('s',$cd), date('m',$cd)+$mth,
   
date('d',$cd)+$day, date('Y',$cd)+$yr));
      return
$newdate;
              }

?>
Hyun Woo Shin 27-Mar-2009 11:32
Just add month(s) on the orginal date.

<?php
function add_date($orgDate,$mth){
 
$cd = strtotime($orgDate);
 
$retDAY = date('Y-m-d', mktime(0,0,0,date('m',$cd)+$mth,date('d',$cd),date('Y',$cd)));
  return
$retDAY;
}
?>
raph 09-Sep-2008 02:37
A little function to add 2 time lenghts. Enjoy !

<?php
function AddPlayTime ($oldPlayTime, $PlayTimeToAdd) {

   
$pieces = split(':', $oldPlayTime);
   
$hours=$pieces[0];
   
$hours=str_replace("00","12",$hours);
   
$minutes=$pieces[1];
   
$seconds=$pieces[2];
   
$oldPlayTime=$hours.":".$minutes.":".$seconds;

   
$pieces = split(':', $PlayTimeToAdd);
   
$hours=$pieces[0];
   
$hours=str_replace("00","12",$hours);
   
$minutes=$pieces[1];
   
$seconds=$pieces[2];
   
   
$str = $str.$minutes." minute ".$seconds." second" ;
   
$str = "01/01/2000 ".$oldPlayTime." am + ".$hours." hour ".$minutes." minute ".$seconds." second" ;
   
   
// Avant PHP 5.1.0, vous devez comparer avec  -1, au lieu de false
   
if (($timestamp = strtotime($str)) === false) {
        return
false;
    } else {
       
$sum=date('h:i:s', $timestamp);
       
$pieces = split(':', $sum);
       
$hours=$pieces[0];
       
$hours=str_replace("12","00",$hours);
       
$minutes=$pieces[1];
       
$seconds=$pieces[2];
       
$sum=$hours.":".$minutes.":".$seconds;
       
        return
$sum;
       
    }
}

$firstTime="00:03:12";
$secondTime="02:04:34";

$sum=AddPlayTime($firstTime,$secondTime);
if (
$sum!=false) {
    echo
$firstTime." + ".$secondTime." === ".$sum;
}
else {
    echo
"failed";
}
?>