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.
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.
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) + (6 * 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.
Aún no hay escrito ningún comentario ![]()
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.
Delivered by FeedBurner
Categorías
Archivos
Blogroll
Enlázanos
Si te gusta MirarPorMirar, puedes poner un enlace en tu web o blog.