Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

Clase Fechas

Estas en el tema de Clase Fechas en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Bueno, es posible que haya una manera mejor de solucionar el asunto de las fechas, aunque he estado mirando en el foro y así... no ...
  #1 (permalink)  
Antiguo 30/11/2005, 09:42
Avatar de MarioNunes  
Fecha de Ingreso: agosto-2005
Mensajes: 280
Antigüedad: 18 años, 8 meses
Puntos: 1
Clase Fechas

Bueno, es posible que haya una manera mejor de solucionar el asunto de las fechas, aunque he estado mirando en el foro y así... no he visto, que no quiere decir que no exista, una solución como la que estaba buscando.

Mirando por internet ya tal al final he llegado a la conclusión de hacer esta clase que la publico aquí porque puede que sea de utilidad para alguien.

Está recien creada y la he probado, para ser una clase más completa habría que hacer el control del formato de la fecha en vez de estar separado por "/" si está por "-" o por espacios o puntos o lo que sea y generar una excepción... pero bueno... ahi va el código. Tambien es posible que por ahi exista una clase bastante mejor, pero esta es la mia xD

Ya se que el constructor y el destructor de la clase sobra por el momento pero.. estoy pensando que más métodos utilizar. Si me dais sugerencias las iré agregando.

fechas.class.php
Código PHP:
<?
class fechas
{
    function 
__construct()
    {
        
    }
    
    function 
diferencia_dias($primera$segunda)
    {
        
$fecha1=$this->separarfecha($primera);
        
$fecha2=$this->separarfecha($segunda);
        
$inicio mktime(0,0,0,$fecha1['mes'],$fecha1['dia'],$fecha1['ano']) ;
        
$fin mktime (0,0,0,$fecha2['mes'],$fecha2['dia'],$fecha2['ano']) ;
        
$resultado $fin $inicio ;
        
$resultado $resultado 60 60 24 ;
         return 
$resultado;
    }
    
    function 
dias_hoy($fecha)
    {
        
$fecha1=$this->separarfecha($fecha);
        
$inicio mktime(0,0,0,$fecha1['mes'],$fecha1['dia'],$fecha1['ano']) ;
        
$fin mktime (0,0,0,date("m"),date("d"),date("y")) ;
        
$resultado $fin $inicio ;
        
$resultado $resultado 60 60 24 ;
        
        return 
$resultado;
    }
    
    
    function 
separarfecha($date
    {
      if (
count($datebits=explode('/',$date))!=3) return false;
      
$dia intval($datebits[0]);
      
$mes intval($datebits[1]);
      
$ano intval($datebits[2]);
    
      return array(
'dia' => $dia,'mes' => $mes,'ano' => $ano);
    }
     
    function 
__destruct()
    {
        
    }
}
?>
Como utilizar la clase:

fechas.php
Código PHP:
<?
include("fechas.class.php");
$obj=new fechas();
$dias=$obj->diferencia_dias("25/11/2005","25/11/2005");
echo 
$dias;
echo 
"<br><br><br>";
$dias=$obj->dias_hoy("25/11/2005");
echo 
$dias;
?>
Bueno, pues espero vuestras sugerencias y/o opiniones.

Un saludo.
__________________
www.pensandoenred.com
  #2 (permalink)  
Antiguo 30/11/2005, 15:02
Avatar de Webstudio
Colaborador
 
Fecha de Ingreso: noviembre-2001
Ubicación: 127.0.0.1
Mensajes: 3.499
Antigüedad: 22 años, 5 meses
Puntos: 69
Bueno, la verdad no voy a ser muy benévolo que digamos, pero tu "clase" en realidad no es tal. Tan solo es un conjunto de funciones desconexas unidas bajo un mismo objeto. ¿No pensaste por qué tu constructor y tu destructor no tienen ningún sentido? Porque da lo mismo si tus funciones están dentro de un objeto o no. Crealas como funciones y vas a ver que dan el mismo servicio.

Un acercamiento realmente orientado a objetos, haría que la clase "Fecha", sea una representación real de una fecha, y sus métodos, operaciones sobre la fecha que el objeto representa. un ejemplo, muy básico, sería :
Código PHP:
<?php
class Fecha
{
    var 
$_fecha null;
    function 
__construct$fecha null )
    {
        if(!
$fecha)
            
$this->_fecha time();
        else
            
$this->_fecha strtotime($fecha);
    }
    
    function 
timestamp()
    {
        return 
$this->_fecha;
    }
    
    function 
diasHastaHoy()
    {
        return 
$this->diferenciaFecha( new Fecha() );
    }
    
    function 
diferenciaFecha(Fecha $fecha)
    {
        
$dias $this->_fecha $fecha->timestamp();
        
// no sabemos cual fecha es mayor o menor, entonces nos aseguramos
        // que la diferencia entre ellas sea un número positivo
        
if($dias 0$dias $dias * (0-1);
        
        
$dias $dias 60 60 24;
        return 
top($dias); //acá hacemos un redondeo
    
}
}
?>
Más allá de errores de sintaxis que pueda haber caido por escribir directamente acá en el fondo, la idea es la de crear objetos como representaciones de algo, no como un mero conjunto de funciones que bien podrían ir en una librería de código procedural. ¿Notas como cambia la idea, y como se simplifica el desarrollo? Internamente, manejamos la representación de una fecha constantemente como timestamp, que facilita los cálculos, y a la persona que utiliza nuestra clase, no le interesa como está implementado, solo quiere poder realizar las funciones que proveemos.

El siguiente es un simple ejemplo de utilización :

Código PHP:
<?php
$fecha1 
= new Fecha("12/12/2004");
$fecha2 = new Fecha("16/01/2005");
echo 
'la diferencia en días es de '.$fecha1->diferenciaFecha($fecha2).' dias<br>';
echo 
'la diferencia en días a hoy es de '.$fecha1->diferenciaHastaHoy().' dias<br>';
?>
__________________
Tutoriales Photoshop | Web-Studio.com.ar
Artículos PHP | ZonaPHP.com
  #3 (permalink)  
Antiguo 01/12/2005, 04:24
Avatar de MarioNunes  
Fecha de Ingreso: agosto-2005
Mensajes: 280
Antigüedad: 18 años, 8 meses
Puntos: 1
Buenas,

No me parece que hayas sido malévolo xD ya que tienes toda la razón, como comenté en mi post los constructores y desctructores no tenian sentido, ya que lo que primero había hecho como puedes comprobar son los métodos de la clase... conozco un poco POO y php, y se que lo que está publicado en mi post es un cojunto de funciones en una clase que por si mismas harían lo mismo.

Pero gracias por la respuesta y agradezco ese código para mejora ;)

Ya que estamos aquí charlando sobre clases en PHP... he estado mirando por internet y he leido que PHP no admite la sobrecarga de métodos... lo he probado con la sintaxis que conozco de C# "ya que se parece un poco" pero nop... no ha funcionado :)

La información no era de un site oficial de PHP ¿es correcta esa información?

Gracias y un saludo.
__________________
www.pensandoenred.com
  #4 (permalink)  
Antiguo 01/12/2005, 09:08
Avatar de MarioNunes  
Fecha de Ingreso: agosto-2005
Mensajes: 280
Antigüedad: 18 años, 8 meses
Puntos: 1
A ver que te parece esta nueva versión:

fechas.class.php
Código PHP:
<?php
class Fecha
{
    var 
$_fecha null;
    var 
$_arrFecha = array('dia','mes','ano');
    
    function 
__construct$fecha null )
    {
        if(!
$fecha)
            
$this->_fecha date("d")."/".date("m")."/".date("Y");
        else
            
$this->_fecha $fecha;
            
        if(!
$this->comprobarFecha())
        {
            
$error "La fecha " $this->_fecha " no tiene el formato correcto.";
            throw new 
Exception($error);
        }
    }
    
    function 
verFecha()
    {
        return 
$this->_fecha;
    }
    
    function 
comprobarFecha()
    {
        
$strDate $this->_fecha;
        
$isValid false;
        if (
ereg('^([0-9]{1,2})[-,/]([0-9]{1,2})[-,/](([0-9]{2})|([0-9]{4}))$'$strDate)) {
           
$dateArr split('[-,/]'$strDate);
           
$this->_arrFecha['dia']=$dateArr[0]; $this->_arrFecha['mes']=$dateArr[1]; $this->_arrFecha['ano']=$dateArr[2];
           
$isValid checkdate($this->_arrFecha['mes'], $this->_arrFecha['dia'], $this->_arrFecha['ano']);
        }
        return 
$isValid;
    }
    
    function 
diasHastaHoy()
    {
        return 
$this->diferenciaFecha( new Fecha() );
    }
    
    function 
diferenciaFecha(Fecha $fecha)
    {
        
$inicio mktime(0,0,0,$this->_arrFecha['mes'],$this->_arrFecha['dia'],$this->_arrFecha['ano']) ;
        
$fin mktime (0,0,0,$fecha->_arrFecha['mes'],$fecha->_arrFecha['dia'],$fecha->_arrFecha['ano']) ;
        
$dias $fin $inicio ;
        
$dias $dias 60 60 24 ;
        return 
$dias;
    }
}
?>
fechas.php
Código PHP:
<?php
include("fechas.class.php");
try
{
    
$fecha1 = new Fecha("16-01-2005");
    
$fecha2 = new Fecha("12/12/2004");
    echo 
'la diferencia en días es de '.$fecha1->diferenciaFecha($fecha2).' dias<br>';
    echo 
'la diferencia en días a hoy es de '.$fecha1->diasHastaHoy().' dias<br>'
}
catch (
Exception $e)
{
    echo 
"<b>Se ha producido una Excepción: </b>",  $e->getMessage(), "\n";
}

?>
Espero tu opinión o corrección. Un saludo.
__________________
www.pensandoenred.com
  #5 (permalink)  
Antiguo 06/12/2005, 14:03
Avatar de Mauri1  
Fecha de Ingreso: noviembre-2002
Ubicación: Santiago de Chile
Mensajes: 558
Antigüedad: 21 años, 5 meses
Puntos: 0
Hola

Justo es lo que andaba buscando !!. Pero hay alguna forma para que la diferencia se muestre en horas ?

Muchas gracias.
  #6 (permalink)  
Antiguo 06/12/2005, 14:34
Avatar de Mauri1  
Fecha de Ingreso: noviembre-2002
Ubicación: Santiago de Chile
Mensajes: 558
Antigüedad: 21 años, 5 meses
Puntos: 0
Ya conseguí lo que quería, simplemente almacené $fecha1->diferenciaFecha($fecha2) en una variable y esa variable la multiplique por 24.


Muchas gracias
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 13:53.