Número de bisiestos entre dos años
Este trozo de código lo utilizamos para ilustrar el uso de la función checkdate(). Hay que tener en cuenta que el orden de los argumentos de esta función es mes,día y año.
Calculamos el número de bisiestos entre 1960 y 2000:
$inicial=1960;
$final=2000;
$bisiestos=0;
for ($i=$inicial; $i<=$final;$i++)
{
if (checkdate(2,29,$i)
$bisiestos++
}
echo "Los años bisiestos entre los años $inicial y $final son $bisiestos";
Diferencia entre dos fechas
Ahora vamos a calcular el número de días comprendidos entre dos fechas. De nuevo lo hacemos mediante una función:
<?php
function resta_fechas($fecha1,$fecha2)
{
if (preg_match("/[0-9]{1,2}\/[0-9]{1,2}\/([0-9][0-9]){1,2}/",$fecha1))
list($dia1,$mes1,$año1)=split("/",$fecha1);
if (preg_match("/[0-9]{1,2}-[0-9]{1,2}-([0-9][0-9]){1,2}/",$fecha1))
list($dia1,$mes1,$año1)=split("-",$fecha1);
if (preg_match("/[0-9]{1,2}\/[0-9]{1,2}\/([0-9][0-9]){1,2}/",$fecha2))
list($dia2,$mes2,$año2)=split("/",$fecha2);
if (preg_match("/[0-9]{1,2}-[0-9]{1,2}-([0-9][0-9]){1,2}/",$fecha2))
list($dia2,$mes2,$año2)=split("-",$fecha2);
$dif = mktime(0,0,0,$mes1,$dia1,$año1) - mktime(0,0,0,$mes2,$dia2,$año2);
$ndias=floor($dif/(24*60*60));
return($ndias);
}
echo '<head>
<title>'.$_SERVER[PHP_SELF].'</title>
</head>
<html>
<body>';
$f1="27-7-1975";
$numdias=resta_fechas(date("d/m/Y"),$f1);
echo "Desde $f1 hasta hoy han transcurrido $numdias <br>";
echo "<a href=$_SERVER[PHP_SELF]>Recargar la Página</a>";
echo '</body>
</html>';
?>
Sumar días a una fecha
El siguiente ejemplo incluye una función para sumar días a una fecha. Su fundamento es pasar todo a segundos (timestamp), realizar la suma y volver a convertir el resultado a formato de fecha:
<?php
function suma_fechas($fecha,$ndias)
{
if (preg_match("/[0-9]{1,2}\/[0-9]{1,2}\/([0-9][0-9]){1,2}/",$fecha))
list($dia,$mes,$año)=split("/", $fecha);
if (preg_match("/[0-9]{1,2}-[0-9]{1,2}-([0-9][0-9]){1,2}/",$fecha))
list($dia,$mes,$año)=split("-",$fecha);
$nueva = mktime(0,0,0, $mes,$dia,$año) + $ndias * 24 * 60 * 60;
$nuevafecha=date("d-m-Y",$nueva);
return ($nuevafecha);
}
echo '<head>
<title>'.$_SERVER[PHP_SELF].'</title>
</head>
<html>
<body>';
$f1="30/01/1993";
$f2="30-01-1992";
$f11=suma_fechas($f1, 25);
echo "$f1 más 25 es $f11<br>";
$f11=suma_fechas($f1, -40);
echo "$f1 menos 40 es $f11<br>";
$f21=suma_fechas($f2, 365);
echo "$f2 más 365 es $f21<br>";
$f21=suma_fechas($f2, -365);
echo "$f2 menos 365 es $f21<br>";
echo "<a href=$_SERVER[PHP_SELF]>Recargar la Página</a>";
echo '</body>
</html>';
?>
Comparar dos fechas
En el siguiente ejemplo vemos una función que compara dos fechas devolviendo un valor positivo, negativo o nulo si la primera fecha es respectivamente mayor, menor o igual que la segunda.
Para complicar las cosas un poco, la función usa expresiones regulares para que admita fechas tanto en formato "dd-mm-aaaa" como con formato "dd/mm/aaaa", dotando a la función de algo más de inteligencia.
<?php
function compara_fechas($fecha1,$fecha2)
{
if (preg_match("/[0-9]{1,2}\/[0-9]{1,2}\/([0-9][0-9]){1,2}/",$fecha1))
list($dia1,$mes1,$año1)=split("/",$fecha1);
if (preg_match("/[0-9]{1,2}-[0-9]{1,2}-([0-9][0-9]){1,2}/",$fecha1))
list($dia1,$mes1,$año1)=split("-",$fecha1);
if (preg_match("/[0-9]{1,2}\/[0-9]{1,2}\/([0-9][0-9]){1,2}/",$fecha2))
list($dia2,$mes2,$año2)=split("/",$fecha2);
if (preg_match("/[0-9]{1,2}-[0-9]{1,2}-([0-9][0-9]){1,2}/",$fecha2))
list($dia2,$mes2,$año2)=split("-",$fecha2);
$dif = mktime(0,0,0,$mes1,$dia1,$año1) - mktime(0,0,0, $mes2,$dia2,$año2);
return ($dif);
}
echo '<head>
<title>'.$_SERVER[PHP_SELF].'</title>
</head>
<html>
<body>';
$f1="30/01/1993";
$f2="30-01-1992";
if (compara_fechas($f1,$f2) <0)
echo "$f1 es menor que $f2 <br>";
if (compara_fechas($f1,$f2) >0)
echo "$f1 es mayor que $f2 <br>";
if (compara_fechas($f1,$f2) ==0)
echo "$f1 es igual que $f2 <br>";
echo "<a href=$_SERVER[PHP_SELF]>Recargar la Página</a>";
echo '</body>
</html>';
?>
Poner fechas con nombres
Para poner fechas con nombres de días de la semana o de mes en el idioma deseado lo podemos hacer de una forma cómoda con la función setlocale para seleccionar el idioma y strftime para darle formato a la fecha. Por ejemplo:
setlocale(LC_TIME,"es");
strftime("%A, %d de %B de %Y,time());
Pondría algo como:
sábado, 25 de julio de 1987