Calcular el tiempo exacto entre dos fechas


Algoritmo de programación en php para el calculo de dias meses y años entre dos periodos de tiempo

Veamos este algoritmo para calcular los años, meses y días entre dos fechas dadas. No comprobaremos si las fechas entradas son correctas.

Primero especificaremos las dos fechas (Las fechas deberán tener el formato dd/mm/aaaa para que el programa funcione correctamente).

$fechaInicio ="28/02/1999";
$fechaActual = "29/02/2000";

Cortamos el texto para seleccionar el dia, mes y año de la fecha Actual y de la fecha de Inicio respectivamente con la función substr de php.
$diaActual = substr($fechaActual, 0, 2);
$mesActual = substr($fechaActual, 3, 5);
$anioActual = substr($fechaActual, 6, 10);
$diaInicio = substr($fechaInicio, 0, 2);
$mesInicio = substr($fechaInicio, 3, 5);
$anioInicio = substr($fechaInicio, 6, 10);

Ahora utilizaremos una variable auxiliar donde guardaremos el número de días que tiene el mes anterior al mes Inicio. Tendremos en cuenta también el mes de febrero, para calcular si un año es bisiesto utilizaremos la condición ($anioActual%4==0 && $anioActual%100!=0) || $anioActual%400==0

$b = 0;
$mes = $mesInicio-1;
if($mes==2){
if(($anioActual%4==0 && $anioActual%100!=0) || $anioActual%400==0){
$b = 29;
}else{
$b = 28;
}
}
else if($mes<=7){
if($mes==0){
 $b = 31;
}
  else if($mes%2==0){
  $b = 30;
  }
  else{
  $b = 31;
  }
  }
  else if($mes>7){
  if($mes%2==0){
  $b = 31;
  }
  else{
  $b = 30;
  }
  }


Seguimos con el código que calculará los días, meses y años:

 if(($anioInicio>$anioActual) || ($anioInicio==$anioActual && $mesInicio>$mesActual) || 
  ($anioInicio==$anioActual && $mesInicio == $mesActual && $diaInicio>$diaActual)){
  echo "La fecha de inicio ha de ser anterior a la fecha Actual";
  }else{
  if($mesInicio <= $mesActual){
  $anios = $anioActual - $anioInicio;
  if($diaInicio <= $diaActual){
  $meses = $mesActual - $mesInicio;
  $dies = $diaActual - $diaInicio;
  }else{
  if($mesActual == $mesInicio){
  $anios = $anios - 1;
  }
  $meses = ($mesActual - $mesInicio - 1 + 12) % 12;
  $dies = $b-($diaInicio-$diaActual);
  }
  }else{
  $anios = $anioActual - $anioInicio - 1;
  if($diaInicio > $diaActual){
  $meses = $mesActual - $mesInicio -1 +12;
  $dies = $b - ($diaInicio-$diaActual);
  }else{
  $meses = $mesActual - $mesInicio + 12;
  $dies = $diaActual - $diaInicio;
  }
  }
  echo "Años: ".$anios." <br />";
  echo "Meses: ".$meses." <br />";
  echo "Días: ".$dies." <br />";
  }

Código Completo

<?php $fechaInicio ="28/02/1999";
$fechaActual = "29/02/2000";
  $diaActual = substr($fechaActual, 0, 2);
$mesActual = substr($fechaActual, 3, 5);
$anioActual = substr($fechaActual, 6, 10);
$diaInicio = substr($fechaInicio, 0, 2);
$mesInicio = substr($fechaInicio, 3, 5);
$anioInicio = substr($fechaInicio, 6, 10);
  $b = 0;
$mes = $mesInicio-1;
if($mes==2){
if(($anioActual%4==0 && $anioActual%100!=0) || $anioActual%400==0){
$b = 29;
}else{
$b = 28;
}
}
else if($mes<=7){
if($mes==0){
 $b = 31;
}
  else if($mes%2==0){
  $b = 30;
  }
  else{
  $b = 31;
  }
  }
  else if($mes>7){
  if($mes%2==0){
  $b = 31;
  }
  else{
  $b = 30;
  }
  }
   if(($anioInicio>$anioActual) || ($anioInicio==$anioActual && $mesInicio>$mesActual) || 
  ($anioInicio==$anioActual && $mesInicio == $mesActual && $diaInicio>$diaActual)){
  echo "La fecha de inicio ha de ser anterior a la fecha Actual";
  }else{
  if($mesInicio <= $mesActual){
  $anios = $anioActual - $anioInicio;
  if($diaInicio <= $diaActual){
  $meses = $mesActual - $mesInicio;
  $dies = $diaActual - $diaInicio;
  }else{
  if($mesActual == $mesInicio){
  $anios = $anios - 1;
  }
  $meses = ($mesActual - $mesInicio - 1 + 12) % 12;
  $dies = $b-($diaInicio-$diaActual);
  }
  }else{
  $anios = $anioActual - $anioInicio - 1;
  if($diaInicio > $diaActual){
  $meses = $mesActual - $mesInicio -1 +12;
  $dies = $b - ($diaInicio-$diaActual);
  }else{
  $meses = $mesActual - $mesInicio + 12;
  $dies = $diaActual - $diaInicio;
  }
  }
  echo "Años: ".$anios." <br />";
  echo "Meses: ".$meses." <br />";
  echo "Días: ".$dies." <br />";
  }?>

Finalmente os recomiendo esta web que contiene una calculadora para poder hacer pruebas de cálculo de fechas.

Detalles sobre este artículo

Enviado por WebTutoriales.com:
Fecha Publicación: 16.12.2006
Este artículos ha sido visto 13.078 veces.
Vota este artículo:

  • Currently 5.00/5
  • 1
  • 2
  • 3
  • 4
  • 5

5.0/5 de 1 voto

Otros Artículos Relacionados

Enlaza Este Artículo Desde tu Web

El enlace se verá así: Calcular el tiempo exacto entre dos fechas

Comentarios

Si tienes algún comentario o sugerencia, utiliza el formulario. Enviar Comentario

  COMENTARIOS
Posteado por Curda, el 24.09.2007, 11:25
queda mucho mejor esta funcion para esta solucion: //defino fecha 2 con variables ejemplo: 02/02/2000 $dia2 = substr($fecha2, 0, 2); $mes2 = substr($fecha2, 3, 5); $ano2 = substr($fecha2, 6, 10); //defino fecha 1 $dia1 = substr($fecha1, 0, 2); $mes1 = substr($fecha1, 3, 5); $ano1 = substr($fecha1, 6, 10); //calculo timestam de las dos fechas $timestamp1 = mktime(0,0,0,$mes1,$dia1,$ano1); //fecha1 $timestamp2 = mktime(4,12,0,$mes2,$dia2,$ano2); //fecha2 //resto a una fecha la otra $segundos_diferencia = $timestamp1 - $timestamp2; //echo $segundos_diferencia; //convierto segundos en días $dias_diferencia = $segundos_diferencia / (60 * 60 * 24); //obtengo el valor absoulto de los días (quito el posible signo negativo) $dias_diferencia = abs($dias_diferencia); //quito los decimales a los días de diferencia $dias_diferencia = floor($dias_diferencia); echo $dias_diferencia;

Posteado por aprendiendo php, el 02.11.2007, 10:53
este ejemplo no funciona cuando tengo estas 2 fechas: $fechaInicio ="01/02/2000"; $fechaActual = "29/02/2000"; POR FAVOR ME PODRIAN DECIR DONDE PUEDE ESTAR EL ERROR XQ NO LO ENCUENTRO... GRACIAS