Der feine Unterschied

Das hat mich heute einige Zeit gekostet: Während der SQL-Befehl DATE_ADD() mit einem Intervall von 6 Monaten bei einem Startdatum vom 31.12. erwartungsgemäß den 30.06. des Folgejahres ermittelt, kommt die entsprechende PHP Funktion strtotime() auf den 1.7.

SQL

SELECT DATE_ADD('2012-12-31', INTERVAL 6 MONTH);
# 2013-06-30

PHP

$d = mktime(0,0,0,12,31,2012);
$interval6month = strtotime('+6 months',$d);
// 2013-07-01

Man kann das umgehen, in dem man zum Beispiel

$d = mktime(0,0,0,12,31,2012);
$interval6month = strtotime('last day of +6 months',$d);
// 2013-06-30

schreibt (ab PHP 5.3), aber wenn der Tag nicht immer der erste oder letzte ist, sondern zum Beispiel der 15. eines Monats, kommt man damit nicht viel weiter.

Geholfen habe ich mir jetzt so:

function addMonths ($year,$month,$day,$interval_months) {
   $correction = '';
   if ($day==1) {
      $correction = 'first day of ';
   } elseif ($day>27) {
      $correction = 'last day of ';
   }
   return strtotime($correction.'+'.$interval_months.' months',
      mktime(0,0,0,$month,$day,$year));
}

Vielleicht brauche ich das ja noch mal. Vielleicht gibt es aber auch eine viel einfachere Lösung?