Hola:
 
Ojala que esto le sirva a todos los que trabajan con fechas
yo he desarrollado un código para trabajar con ellas 
hasta ahora no me ha dado problemas, asi que lo dejo a disposición por si alguien desea utilizarlo 
si hay usuarios que deseen revisarlo y hacer correcciones si algo no está bien, bienvenido sea, pero así como yo lo he puesto a disposición, si alguien encuentra algun error, por favor comentelo y así desarrollamos entre todos un código mucho mejor.  
 Código PHP:
    <?
if(!defined(FCO_FECHAS)){
DEFINE("FCO_FECHAS","TRUE");
function ceros($num,$long=2)
{
    $res='';
    $num=''.$num;
    for($i=0;$i<$long;$i++)
    {
        if(!isset($num[$i]))
            $res='0'.$res;
        else
            $res.=$num[$i];
    }
    return($res);
}
function esBisiesto($a){
    if(($a%4==0)&&($a%100!=0))
        return 1;
    elseif($a%400==0)
        return 1;
    else
        return 0;
}
class fechaCompleta{
    var $anno;
    var $mes;
    var $dia;
    var $hora;
    var $minuto;
    var $segundo;
    function fechaCompleta($date=NULL){
        if($date==NULL)    $date=time();
        if(is_numeric($date))
        {
            $date=date('Y-m-d h:i:s',$date);
        }
        if(!is_numeric($date)&&strlen($date)==19)
        {
            $this->anno=$date[0].$date[1].$date[2].$date[3];
            $this->mes=$date[5].$date[6];
            $this->dia=$date[8].$date[9];
            $this->hora=$date[11].$date[12];
            $this->minuto=$date[14].$date[15];
            $this->segundo=$date[17].$date[18];
        }
        else
        {
            $this->anno='0000';
            $this->mes=$this->dia=$this->hora=$this->minuto=$this->segundo='00';
        }
        $this->CuadrarFecha();
    }
    function ObtenerFecha(){
        return(ceros($this->anno,4).'-'.ceros($this->mes).'-'.ceros($this->dia).' '.ceros($this->hora).':'.ceros($this->minuto).':'.ceros($this->segundo));
    }
        
    function MostrarFecha(){
        print($this->ObtenerFecha());
    }
    function CuadrarFecha(){
        $this->minuto+=div($this->segundo,60);
        $this->segundo%=60;
        $this->hora+=div($this->minuto,60);
        $this->minuto%=60;
        $this->dia+=div($this->hora,24);
        $this->hora%=24;
        while(div($this->dia,27)==2){
            $this->dia-=27;
            $this->CuadrarFecha();
            $this->dia+=27;
        }
        /*MESES*/
        if($this->mes=='1'||$this->mes=='3'||$this->mes=='5'||$this->mes=='7'||$this->mes=='8'||$this->mes=='10'||$this->mes=='0')
        {
            if($this->dia!='31')
            {
                $this->mes+=div($this->dia,31);
                $this->dia%=31;
            }
        }
        elseif($this->mes=='4'||$this->mes=='6'||$this->mes=='9'||$this->mes=='11')
        {
            if($this->dia!='30')
            {
                $this->mes+=div($this->dia,30);
                $this->dia%=30;
            }
        }
        elseif(!esBisiesto($this->anno))
        {
            if($this->dia!='28')
            {
                $this->mes+=div($this->dia,28);
                $this->dia%=28;
            }
        }else
        {
            if($this->dia!='29')
            {
                $this->mes+=div($this->dia,29);
                $this->dia%=29;
            }
        }
        /*AÑOS*/
        if($this->mes!='12')
        {
            $this->anno+=div($this->mes,12);
            $this->mes%=12;
        }
    }
    function Suma($date2){
        if(!isset($date2->anno))
            $date2 = new fechaCompleta($date2);
        $this->anno=$this->anno + $date2->anno;
        $this->mes=$this->mes + $date2->mes;
        $this->dia=$this->dia + $date2->dia;
        $this->hora=$this->hora + $date2->hora;
        $this->minuto=$this->minuto + $date2->minuto;
        $this->segundo=$this->segundo + $date2->segundo;
        $this->CuadrarFecha();
    }
    function anno2(){
        return $this->anno%100;
    }
    function Resta($date){
        $meses[1]=$meses[3]=$meses[5]=$meses[7]=$meses[8]=$meses[10]=$meses[12]=31;
        $meses[2]=28;
        $meses[4]=$meses[6]=$meses[9]=$meses[11]=30;
        $anno=$this->anno;
        if(!isset($date->anno))
            $date = new fechaCompleta($date);
        if($this->segundo<$date->segundo){
            $this->segundo+=60;
            $date->minuto+=1;
            $date->CuadrarFecha();
        }
        $this->segundo-=$date->segundo;
        if($this->minuto<$date->minuto){
            $this->minuto+=60;
            $date->hora+=1;
            $date->CuadrarFecha();
        }
        $this->minuto-=$date->minuto;
        if($this->hora<$date->hora){
            $this->hora+=24;
            $date->dia+=1;
            $date->CuadrarFecha();
        }
        $this->hora-=$date->hora;
        if($this->dia<=$date->dia){
            if($this->mes==1)
                $this->dia+=$meses[12];
            elseif(!esBisiesto($this->anno))
                $this->dia+=$meses[$this->mes-1];
            elseif(esBisiesto($this->anno)&&$this->mes!='03')
                $this->dia+=$meses[$this->mes-1];
            else
                $this->dia+=29;
            $date->mes+=1;
            $date->CuadrarFecha();
        }
        $this->dia-=$date->dia;
        if($this->mes<=$date->mes){
            $this->mes+=12;
            $date->anno+=1;
        }
        $this->mes-=$date->mes;
        if($this->anno<$date->anno)
            $date->anno=$this->anno;
        $this->anno-=$date->anno;
        $this->CuadrarFecha();
    }
    function ContarDias($date)
    {
        if(!isset($date->anno))
            $date = new fechaCompleta($date);
        $tim=mktime($this->hora-$date->hora,$date->minuto,$date->segundo,$date->mes,$date->dia,$date->anno);
        $end=mktime($this->hora,$this->minuto,$this->segundo,$this->mes,$this->dia,$this->anno);
        return (int)(($end-$tim)/86400);
    }
    function Menor_que($date)
    {
        if(!isset($date->anno))
            $date = new fechaCompleta($date);
        if($this->anno < $date->anno)
            return true;
        elseif($this->anno > $date->anno)
            return false;
        elseif($this->mes < $date->mes)
            return true;
        elseif($this->mes > $date->mes)
            return false;
        elseif($this->dia < $date->dia )
            return true;
        elseif($this->dia > $date->dia )
            return false;
        elseif($this->hora < $date->hora )
            return true;
        elseif($this->hora > $date->hora )
            return false;
        elseif($this->minuto < $date->minuto )
            return true;
        elseif($this->minuto > $date->minuto )
            return false;
        elseif($this->segundo < $date->segundo )
            return true;
        elseif($this->segundo > $date->segundo )
            return false;
        else
            return false;
    }
    function Mayor_que($date)
    {
        if(!isset($date->anno))
            $date = new fechaCompleta($date);
        if($this->anno > $date->anno)
            return true;
        elseif($this->anno < $date->anno)
            return false;
        elseif($this->mes > $date->mes)
            return true;
        elseif($this->mes < $date->mes)
            return false;
        elseif($this->dia > $date->dia )
            return true;
        elseif($this->dia < $date->dia )
            return false;
        elseif($this->hora > $date->hora )
            return true;
        elseif($this->hora < $date->hora )
            return false;
        elseif($this->minuto > $date->minuto )
            return true;
        elseif($this->minuto < $date->minuto )
            return false;
        elseif($this->segundo > $date->segundo )
            return true;
        elseif($this->segundo < $date->segundo )
            return false;
        else
            return false;
    }
}
}
?>    
  Como ya dije, hasta ahora no me ha dado problemas, lo he sometido a varias pruebas, y no he encontrado errores. 
la forma de utilizar las sumas y restas, se pueden hacer con una variable de la misma clase
o con un string 
Ejemplo: 
 Código PHP:
    $fecha=new fechaCompleta('2008-03-08 00:00:00');
//Sumar 5 días
$fecha->Suma('0000-00-05 00:00:00');
$resultado=$fecha->ObtenerFecha();
//El valor de la variable $resultado será '2008-03-13 00:00:00'