Ver Mensaje Individual
  #1 (permalink)  
Antiguo 26/02/2012, 19:26
Avatar de CreativeMedia
CreativeMedia
 
Fecha de Ingreso: febrero-2012
Ubicación: Cadiz
Mensajes: 3
Antigüedad: 14 años, 8 meses
Puntos: 0
[Aporte] Clase para tratar fechas

Hola compañeros,

mi primer mensaje en el foro y me presento con este aporte. Se trata de una clase para tratar fechas en PHP que estoy realizando al no tener mi servidor soporte aún para 5.3 y poder hacer uso de la clase nativa [URL="http://www.php.net/manual/es/class.datetime.php"]dateTime[/URL].

Aún la estoy testeando para implementar nuevas funcionalidades y que espero que con vuestra ayuda podamos mejorarla para uso de que quiera.

Código PHP:
<?php
    
    
/**
     * Author: Jesús Gómez @ http://www.CreativeMedia.es
     * Copyright: Jesús Gómez
     * Date: 27-02-2012
     */
    
class Fecha
    
{
        private 
$_segundos;
        private 
$_minutos;
        private 
$_horas;
        private 
$_dia;
        private 
$_mes;
        private 
$_ano;
        
        public function 
__construct($ano = 1970, $mes = 1, $dia = 1, $horas = 0, $minutos = 0, $segundos = 0)
        {
            
$this->setFecha($ano, $mes, $dia, $horas, $minutos, $segundos);
        }
        
        
/**
         * SETTERS
         */
        
public function setSegundos($s)
        {
            
$this->_segundos = $s;
        }
        
        public function 
setMinutos($m)
        {
            
$this->_minutos = $m;
        }
        
        public function 
setHoras($h)
        {
            
$this->_hora = $h;
        }
        
        public function 
setDia($d)
        {
            
$this->_dia = $d;
        }
        
        public function 
setMes($m)
        {
            
$this->_mes = $m;
        }
        
        public function 
setAno($a)
        {
            
$this->_ano = $a;
        }
        
        public function 
setFecha($ano = 1970, $mes = 1, $dia = 1, $horas = 0, $minutos = 0, $segundos = 0)
        {
            
$this->_segundos = $segundos;
            
$this->_minutos = $minutos;
            
$this->_horas = $horas;
            
$this->_dia = $dia;
            
$this->_mes = $mes;
            
$this->_ano = $ano;
        }
        
        public function 
addSegundos($s)
        {
            
$this->_segundos += $s;
        }
        
        public function 
addMinutos($m)
        {
            
$this->_minutos += $m;
        }
        
        public function 
addHoras($h)
        {
            
$this->_horas += $h;
        }
        
        public function 
addDias($d)
        {
            
$this->_dia += $d;
        }
        
        public function 
addMeses($m)
        {
            
$this->_mes += $m;
        }
        
        public function 
addAnos($a)
        {
            
$this->_ano += $a;
        }
        
        
/**
         * GETTERS
         */
        /*
         * @param   string (formato date http://php.net/manual/es/function.date.php)
         * @return  integer
         */
        
public function getFormato($formato)
        {
            return 
date($formato, @mktime($this->_horas, $this->_minutos, $this->_segundos, $this->_mes, $this->_dia, $this->_ano));
        }
        
        public function 
getSegundos()
        {
            return 
$this->_segundos;
        }
        
        public function 
getMinutos()
        {
            return 
$this->_minutos;
        }
        
        public function 
getHoras()
        {
            return 
$this->_horas;
        }
        
        public function 
getDia()
        {
            return 
$this->_dia;
        }
        
        public function 
getMes()
        {
            return 
$this->_mes;
        }
        
        public function 
getAno()
        {
            return 
$this->_ano;
        }
        
        
        
/**
         * MISCELÁNEOS
         */
        /*
         * @param   integer
         * @return  boolean
         */
        
public function isValid($ano, $mes, $dia)
        {
            if(!
checkdate($mes, $dia, $ano)) {
                return 
FALSE;
            }
            
            if(
$ano < 1970 || $ano > 2038) {
                return 
FALSE;
            }
            
            return 
TRUE;
        }
        
        
/*
         * Solo es necesario pasar $fecha1, si $fecha2 no es pasado se tomará la fecha actual.
         * Es indiferente que $fecha1 sea mayor a $fecha2 o a la inversa
         *
         * @param   timestamp
         * @return  integer (número de dias de diferencia)
         */
        
public function diferenciaDias($fecha1, $fecha2 = NULL)
        {
            if(empty(
$fecha2)) {
                
$fecha2 = mktime(0, 0, 0, date('m'), date('d'), date('Y'));
            }
            
            
$diferencia = $fecha2 - $fecha1;
            
            return (
$diferencia > 0)
                ? 
floor($diferencia / 86400)
                : 
abs( floor($diferencia / 86400) );
        }
        
        
/*
         * Calcula la edad a partir de la fecha dada y la actual
         *
         * @param   integer
         * @return  string | boolean (FALSE en caso de fecha futura)
         */
        
public function calcularEdad($a, $m, $d)
        {
            
$edad = ( date('md') < $m . $d ) ? date('Y') - $a - 1 : date('Y') - $a;
            
            if(
$edad > 1) {
                return 
$edad . ' años';
            }
            
            if(
$edad == 1) {
                return 
'1 año';
            }
            
            if(
$edad == 0) {
                
//El año dado es menor al actual y el mes actual es menor al de la fecha dada
                
if( date('Y') > $a && date('md') < $m . $d ) {
                    
//El dia actual es mayor al dia dado, se suma este mes 
                    
if( date('d') >= $d ) {
                        return 
12 - $m + date('m') . ' meses';
                    }
                    
//El dia actual es inferior al dia del mes dado, no le sumamos este mes
                    
return 12 - $m + date('m') - 1 . ' meses';
                }
                
                
//El año dado es el actual, el mes y dia actual es mayor al mes y dia dados y la diferencia entre el mes actual y el dado es mayor que 1
                
if( date('Y') == $a && date('md') > $m . $d && (date('m') - $m > 1)) {
                    
//El dia actual es mayor al dado por lo tanto ha cumplido un mes mas hace dias
                    
if(date('d') > $d) {
                        return 
date('m') - $m . ' meses';
                    }
                    
//El dia actual es menor al dado y la diferencia entre el mes actual y el dado es mayor que 2
                    
if(date('m') - $m > 2) {
                        return 
date('m') - $m - 1 . ' meses';
                    }
                    
//El dia actual es menor al dado y la diferencia entre el mes actual y el dado es 1
                    
return date('m') - $m - 1 . ' mes';
                }
                
                
//El mes actual es mayor al dado y el dia actual es mayor al dado (mas de un mes) o el mes actual es mayor al dado y el dia actual es el mismo (un mes exacto)
                
if( date('m') > $m && date('d') > $d || date('m') > $m && date('d') == $d ) {
                    return 
'1 mes';
                }
                
                
//El mes actual es mayor y el dia actual es menor (no se ha completado un mes) o el mes es el mismo y el dia actual es mayor (cuestión de dias) o el mes y el dia son los mismos (XDDD misma fecha!!)
                
if( date('m') > $m && date('d') < $d || date('m') == $m && date('d') > $d || date('m') == $m && date('d') == $d ) {
                    return 
'menos de un mes';
                }
            }
            
            
//Para cualquier fecha no válida, en este caso fechas negativas
            
return FALSE;
        }
        
    }
Ejemplos de uso:

Cambio de formato:
Código PHP:
$fecha = new Fecha(2012, 02, 27);
//Para establecer una fecha posteriormente $fecha->setFecha($ano, $mes, $dia);
echo $fecha->getFormato('d-m-Y'); 
Validar fecha:
Código PHP:
$fecha = new Fecha();
if(
$fecha->isValid(2012, 5, 25)) echo 'Fecha valida'; 
Diferencia de dias:
Código PHP:
$fecha = new Fecha();
$fSegundos = strtotime('2012-01-27');
echo 
$fecha->diferenciaDias($fSegundos); 
Lo ideal sería que hiciera una pequeña documentación pero ando escaso de tiempo para ello. De todas formas es una clase simple.

Espero vuestras aportaciones y opiniones