date_add

Descripción

User Contributed Notes 5 notes

<?phpfunction 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 toif (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 arraypreg_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);}?>

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.

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