PHP strtotime +1 month behaviour

Valentin Despa picture Valentin Despa · Aug 19, 2011 · Viewed 10.5k times · Source

I know about the unwanted behaviour of PHP's function

strtotime

For example, when adding a month (+1 month) to dates like: 31.01.2011 -> 03.03.2011

I know it's not officially a PHP bug, and that this solution has some arguments behind it, but at least for me, this behavior has caused a lot waste of time (in the past and present) and I personally hate it.


What I found even stranger is that for example in:

MySQL: DATE_ADD('2011-01-31', INTERVAL 1 MONTH) returns 2011-02-28 or

C# where new DateTime(2011, 01, 31).AddMonths(1); will return 28.02.2011

wolframalpha.com giving 31.01.2013 + 1 month as input; will return Thursday, February 28, 2013

It sees to me that others have found a more decent solution to the stupid question that I saw alot in PHP bug reports "what day will it be, if I say we meet in a month from now" or something like that. The answer is: if 31 does not exists in next month, get me the last day of that month, but please stick to next month.


So MY QUESTION IS: is there a PHP function (written by somebody) that resolves this not officially recognized bug? As I don't think I am the only one who wants another behavior when adding / subtracting months.

I am particulary interested in solutions what also work not just for the end of the month, but a complete replacement of strtotime. Also the case strotime +n months should be also dealt with.

Happy coding!

Answer

ajreal picture ajreal · Aug 19, 2011

what you need is to tell PHP to be smarter

$the_date = strtotime('31.01.2011');
echo date('r', strtotime('last day of next month', $the_date));

$the_date = strtotime('31.03.2011');
echo date('r', strtotime('last day of next month', $the_date));

assuming you are only interesting on the last day of next month

reference - http://www.php.net/manual/en/datetime.formats.relative.php