Sumar dias naturales a una fecha

Código PHP

PHP – Date – Sumar días naturales

Función que suma un numero determinado de días naturales a una fecha en formato yyyy-mm-dd.

La fecha original no se modifica y devuelve la nueva fecha con los días sumados.

/**
 * Class HelperDate
 */
abstract class HelperDate
{
    /**
     * Suma N días naturales a una fecha.
     * Formato de fecha: yyyy-mm-dd
     *
     * @param string $fecha
     * @param int    $dias
     *
     * @return string
     */
    public static function sumarDiasNaturales($fecha, $dias)
    {
        if ($dias < 0) {
            return '';
        }

        $dateArray = explode("-", $fecha);

        $sd = $dias;

        while ($sd > 0) {
            if ($sd <= date("t", mktime(0, 0, 0,
                                        $dateArray[ 1 ],
                                        1,
                                        $dateArray[ 0 ])
                            ) - $dateArray[ 2 ]) {

                $dateArray[ 2 ] = $dateArray[ 2 ] + $sd;

                $sd = 0;

            } else {

                $sd  = $sd - ( date( "t", mktime(0, 0, 0,
                                                $dateArray[ 1 ],
                                                1,
                                                $dateArray[ 0 ])
                                   ) - $dateArray[ 2 ]);
                $dateArray[ 2 ] = 0;

                if ($dateArray[ 1 ] < 12) {
                    $dateArray[ 1 ]++;
                } else {
                    $dateArray[ 1 ] = 1;
                    $dateArray[ 0 ]++;
                }
            }
        }

        $sDia = '00'.$dateArray[ 2 ];
        $sDia = substr($sDia, -2);

        $sMes = '00'.$dateArray[ 1 ];
        $sMes = substr($sMes, -2);

        return $dateArray[ 0 ].'-'.$sMes.'-'.$sDia;
    }
}

Ejemplos

$dia = HelperDate::sumarDiasNaturales('1999-12-31', 1);    
        /* 2000-01-01 */

$dia = HelperDate::sumarDiasNaturales('1999-1-31', 28);    
        /* 1999-02-28 */

$dia = HelperDate::sumarDiasNaturales('2000-11-10', 100);   
        /* 2001-02-17 */