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;
}
}
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');
Código PHP:
$fecha = new Fecha();
if($fecha->isValid(2012, 5, 25)) echo 'Fecha valida';
Código PHP:
$fecha = new Fecha();
$fSegundos = strtotime('2012-01-27');
echo $fecha->diferenciaDias($fSegundos);
Espero vuestras aportaciones y opiniones
![Afirmando](http://static.forosdelweb.com/fdwtheme/images/smilies/afirmar.gif)