Ver Mensaje Individual
  #1 (permalink)  
Antiguo 07/03/2008, 21:51
fcopacheco
 
Fecha de Ingreso: enero-2008
Mensajes: 68
Antigüedad: 17 años, 1 mes
Puntos: 1
Trabajar con fechas - Codigo Abierto

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' 

Última edición por fcopacheco; 07/03/2008 a las 22:02 Razón: Añadir un ejemplo