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;
}
}
}
?>
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'