Foros del Web » Programando para Internet » PHP »

Trabajar con fechas - Codigo Abierto

Estas en el tema de Trabajar con fechas - Codigo Abierto en el foro de PHP en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 07/03/2008, 21:51
 
Fecha de Ingreso: enero-2008
Mensajes: 68
Antigüedad: 16 años, 3 meses
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
  #2 (permalink)  
Antiguo 07/03/2008, 21:59
Avatar de jaronu  
Fecha de Ingreso: febrero-2008
Mensajes: 2.183
Antigüedad: 16 años, 2 meses
Puntos: 52
Re: Trabajar con fechas - Codigo Abierto

Gracias fcopacheco por compartir y aportar. muy bueno.
Y para los que sabemos poco,
podrias si no es molestia, explicar que hace el script a grandes rasgos?

Gracias.
  #3 (permalink)  
Antiguo 07/03/2008, 22:22
 
Fecha de Ingreso: enero-2008
Mensajes: 68
Antigüedad: 16 años, 3 meses
Puntos: 1
Re: Trabajar con fechas - Codigo Abierto

Cita:
Iniciado por jaronu Ver Mensaje
Gracias fcopacheco por compartir y aportar. muy bueno.
Y para los que sabemos poco,
podrias si no es molestia, explicar que hace el script a grandes rasgos?

Gracias.
No hay Problemas

Primero, este script trabaja con fechas del formato DATETIME utilizado en MySQL

año-mes-dia hora:minuto:segundo

aaaa-MM-dd hh:mm:ss

El Constructor acepta tres tipos de datos

Por si alguien no sabe qué es un constructor, les cuento que es una función que lleva el mismo nombre de la clase, lo que hace es asignar valores apenas creas el objeto.

en este caso el constructor es la funcion "fechaCompleta"

los datos que acepta son:

- una string con el formato "aaaa-MM-dd hh:mm:ss"
- un numero entero del formato time()
- un valor nulo (aqui el valor de la fecha, va a ser el momento justo en que se ejecuta el script, tomando como referencia la fecha del servidor)

lo que hace:

asigna los valores a: anno,mes,dia,hora,minuto,segundo

luego Cuadra la fecha, esto lo explico después


Obtener Fecha

Genera un string con el formato aaaa-MM-dd hh:mm:ss


Mostrar Fecha

Muestra la fecha por pantalla por medio de print()


Cuadrar Fecha

Esta función arregla las fechas para no tener fechas con formatos extraños como

2008-25-80 52:78:70

esa formato claramente es erroneo, pero con esta funcion, los valores se toman y se genera una fecha válida.

Suma

Esta función admite dos tipos de datos

- un objeto de esta misma clase
- un string con el formato ya mencionado

lo que hace:

Simplemente suma a la fecha guardada la fecha ingresada.
un ejemplo de esta función está en mi primer mensaje


Resta

Los mismo que Suma, pero ahora en resta :P


anno2

retorna un string con el año en formato de dos caracteres:

2008 -> 08


Contar Dias

Esta función admite dos tipos de datos

- un objeto de esta misma clase
- un string con el formato ya mencionado

lo que hace es contar los días que transcurrieron entre la fecha pasada por el parámetro y la fecha guardada en el objeto, y los retorna como un entero

Ejemplo:
Código PHP:
$fecha=new fechaCompleta('2008-03-08 00:00:00');
$dias=$fecha->ContarDias('2008-03-01 00:00:00');

//la variable $dias tiene guardado el siguiente valor: 7 
Mayor_que y Menor_que

Estas funciones admiten dos tipos de datos

- un objeto de esta misma clase
- un string con el formato ya mencionado

Lo que hacen es comparar tu fecha, con la pasada por el parámetro, en el orden que indica la función

tu fecha Mayor que la fecha pasada por parametro

o

tu fecha Menor que la fecha pasada por parametro

Esta función retorna un valor booleano, dependiendo de si la "pregunta" es verdadera o falsa

Ejemplo:
Código PHP:
$fecha=new fechaCompleta('2008-03-08 00:00:00');
$bool=$fecha->Mayor_que('2008-03-01 00:00:00');
$bool2=$fecha->Menor_que('2008-03-01 00:00:00');

//la variable $bool guarda un valor verdadero
//la variable $bool2 guarda un valor falso 
Para saber más detalles pueden revisar el código, ahora, si hay algo que no entienda, pregunten con toda confianza

Última edición por fcopacheco; 07/03/2008 a las 22:23 Razón: Corregir términos
  #4 (permalink)  
Antiguo 07/03/2008, 22:39
Avatar de jaronu  
Fecha de Ingreso: febrero-2008
Mensajes: 2.183
Antigüedad: 16 años, 2 meses
Puntos: 52
Re: Trabajar con fechas - Codigo Abierto

Gracias por la respuesta.

es de mucha utilidad, y parece resolver muchos problemas con lor formatos y a demas suma y resta fechas.

Muchisimas gracias, de verdad.
  #5 (permalink)  
Antiguo 09/03/2008, 01:17
 
Fecha de Ingreso: enero-2008
Mensajes: 68
Antigüedad: 16 años, 3 meses
Puntos: 1
Re: Trabajar con fechas - Codigo Abierto

Arregle la funcion Contar Dias
aqui va el nuevo codigo para la funcion

Código PHP:
function ContarDias($date)
    {
        if(!isset(
$date->anno))
            
$date = new fechaCompleta($date);
        
$dend=new fechaCompleta($this->ObtenerFecha());
        
$end=0;
        
$end+=(int)$dend->dia;
        for(
$dend->mes-=1;$dend->mes>0;$dend->mes-=1)
            if(
$dend->mes==and esBisiesto($dend->anno)) $end+=29;
            elseif(
$dend->mes==2$end+=28;
            elseif(
$dend->mes==or $dend->mes==or $dend->mes==or $dend->mes==or $dend->mes==or $dend->mes==10 or $dend->mes==12$end+=31;
            elseif(
$dend->mes==or $dend->mes==or $dend->mes==or $dend->mes==or $dend->mes==11$end+=30;
        for(
$dend->anno-=1;$dend->anno>0;$dend->anno-=1)
            if(
esBisiesto($dend->anno)) $end+=366;
            else 
$end+=365;
        
$begin=0;
        
$begin+=(int)$date->dia;
        for(
$date->mes-=1;$date->mes>0;$date->mes-=1)
            if(
$date->mes==and esBisiesto($date->anno)) $begin+=29;
            elseif(
$date->mes==2$begin+=28;
            elseif(
$date->mes==or $date->mes==or $date->mes==or $date->mes==or $date->mes==or $date->mes==10 or $date->mes==12$begin+=31;
            elseif(
$date->mes==or $date->mes==or $date->mes==or $date->mes==or $date->mes==11$begin+=30;
        for(
$date->anno-=1;$date->anno>0;$date->anno-=1)
            if(
esBisiesto($date->anno)) $begin+=366;
            else 
$begin+=365;
        return (int)(
$end-$begin);
    } 

Les cuento algo mas sobre esta libreria

facilmente podriamos restar fechas o sumarlas utilizando la funcion mktime()
pero solo serviria para fechas que estan por sobre el año 1970

la gracia de esta libreria es que se puede trabajar con cualquier fecha despues del año 0;
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:16.