Existen numerosas funciones en PHP para la manipulación de fechas, sin embargo siempre están limitadas a un rango que va desde 1701 a 2038 en UNIX.

Restar Fechas PHP

De entre todas las operaciones posibles, una de las más comunes es restar dos fechas determinadas, sin embargo cualquier fecha que exceda estas cifras devolverá resultados erróneos.




Posibles soluciones


  • Usar una librería, que permite un rango de fechas desde el año 100 hasta el año 3000 en el futuro. Solo recomendada si vas a trabajar constantemente con fechas, ya que posee más de 1000 líneas de código.
  • La segunda opción es hacer una pequeña función que solvente el problema.



Función para restar fechas


Dado que necesitaba restar fechas de cualquier tiempo, elaboré una función que es capaz de resolver dicha tarea. Aun la estoy probando, de momento funciona correctamente incluso para fechas "AC".

Si tienes el mismo problema a continuación pongo la función, también puedes descargarla aquí.


<?php
function restarFechas ($fecha1$fecha2) {
  
define (year, ((365 24 60 60) + (60 60))); //365 Dias y 6 Horas

  //Separamos dia, mes y año de las fechas
  
$fecha1 explode ("/"$fecha1);
  
$fecha2 explode ("/"$fecha2);

  
//Restamos los años y los pasamos a segundos
  
$anios = (($fecha2[2] - $fecha1[2]) - 1);
  
$anios = ($anios year);

  
//Calculamos los dias transcurridos entre los meses de cada fecha
  
$dias 0;
  
$mes $fecha1[1];
  for (
$i=0$i<2$i++) {
    switch (
$mes) {
      case 
1: if ($dias == 0) { $dias += (31 $fecha1[0]); } elseif ($fecha2[1] == 1) { $dias += $fecha2[0]; break 2; } else { $dias += 31; }
      case 
2: if ($dias == 0) { $dias += (28 $fecha1[0]); } elseif ($fecha2[1] == 2) { $dias += $fecha2[0]; break 2; } else { $dias += 28; }
      case 
3: if ($dias == 0) { $dias += (31 $fecha1[0]); } elseif ($fecha2[1] == 3) { $dias += $fecha2[0]; break 2; } else { $dias += 31; }
      case 
4: if ($dias == 0) { $dias += (30 $fecha1[0]); } elseif ($fecha2[1] == 4) { $dias += $fecha2[0]; break 2; } else { $dias += 30; }
      case 
5: if ($dias == 0) { $dias += (31 $fecha1[0]); } elseif ($fecha2[1] == 5) { $dias += $fecha2[0]; break 2; } else { $dias += 31; }
      case 
6: if ($dias == 0) { $dias += (30 $fecha1[0]); } elseif ($fecha2[1] == 6) { $dias += $fecha2[0]; break 2; } else { $dias += 30; }
      case 
7: if ($dias == 0) { $dias += (31 $fecha1[0]); } elseif ($fecha2[1] == 7) { $dias += $fecha2[0]; break 2; } else { $dias += 31; }
      case 
8: if ($dias == 0) { $dias += (31 $fecha1[0]); } elseif ($fecha2[1] == 8) { $dias += $fecha2[0]; break 2; } else { $dias += 31; }
      case 
9: if ($dias == 0) { $dias += (30 $fecha1[0]); } elseif ($fecha2[1] == 9) { $dias += $fecha2[0]; break 2; } else { $dias += 30; }
      case 
10: if ($dias == 0) { $dias += (31 $fecha1[0]); } elseif ($fecha2[1] == 10) { $dias += $fecha2[0]; break 2; } else { $dias += 31; }
      case 
11: if ($dias == 0) { $dias += (30 $fecha1[0]); } elseif ($fecha2[1] == 11) { $dias += $fecha2[0]; break 2; } else { $dias += 30; }
      case 
12: if ($dias == 0) { $dias += (31 $fecha1[0]); } elseif ($fecha2[1] == 12) { $dias += $fecha2[0]; break 2; } else { $dias += 31; }
    }

    
$mes 1;
  }

  
//Restamos 1 año si los meses coinciden
  
if ($fecha1[1] == $fecha2[1] && $fecha1[0] < $fecha2[0]) {
    
$dias $dias 365;
  }

  
//Pasamos los dias a segundos
  
$segundos = ($dias 24 60 60);

  
//Sumamos los segundos de anios y meses
  
if ($fecha1[1] < $fecha2[1]) { $segundos = ($anios year $segundos); }
  elseif (
$fecha1[1] > $fecha2[1]) { $segundos = ($anios $segundos); }
  elseif (
$fecha1[0] < $fecha2[0]) { $segundos = ($anios year $segundos);}
  elseif (
$fecha1[0] > $fecha2[0]) { $segundos = ($anios $segundos); }
  else { 
$segundos = ($anios year); }

  
//Devolvemos la diferencia entre las dos fechas en segundos
  
return ($segundos);
}
?>

La función recibe dos fechas, (la primera anterior en el tiempo a la segunda), y devuelve la diferencia entre las dos en segundos.

Teniendo los segundos puedes formatearla como quieras, por ejemplo para obtener los años, tan solo divide el resultado entre 31557600, que equivaldría a 365 días y 6 horas en segundos.

Si te gustó el artículo...

Puedes seguir el blog a través de Twitter, Facebook o tu lector de feeds RSS.

Artículos Relacionados

0 Comentarios

Aún no hay escrito ningún comentario

Deja tu Comentario

Asigna una imagen a tu email con Gravatar, si no sabes accede al siguiente Tutorial.



Asigna una imagen a tu email
Nombre
Email [Requerido]
Web/Blog

Información

  • Aplicamos el tag nofollow, y los enlaces con keywords en los comentarios podrían ser eliminados, intentamos mantener limpio el blog de spam.

  • Puedes usar las etiquetas <i>, <b>, <em>, <strong>, <a>, href, procura cerrarlas adecuadamente o tu comentario podria no mostrarse del modo que deseas.

  • Si necesitas que se vean en el comentario caracteres especiales como los usados en lenguajes de programacion como php, xhtml, etc., debes escribirlo dentro de las etiquetas [code] [/code], de lo contrario no se mostrará.

  • Procura no escribir enlaces que no tengan ninguna relación con el tema.

  • Si realizas una crítica procura argumentarla, pero sobretodo evita los insultos.