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