Buscador


En todo Internet
En Uterra.Com

Consultorio sexológico
El psicólogo responde
GRATIS
Preguntas y respuestas sobre sexualidad.

Contenidos


En este artículo ya hablamos del manejo de las fechas con PHP. Vimos el problema de los usos horarios, y como el manejo de las fechas, algo aparentemente sencillo, tiene muchos matices que debemos tener en cuenta. También vimos en este otro artículo como podíamos expresar una fecha en el idioma que deseásemos, aunque esto no es más que un problema de formato de presentación de fechas.

Para el cálculo de diferencia entre dos fechas, el mayor problema es la diferencia entre los que es un “años de calendario” y lo que es un año astronómico.

Con el año de calendario se hace referencia al año tal y como lo vemos en un calendario, unos meses tienen una duración diferente a otros, e incluso no todos los años duran lo mismo, los años bisiestos.

La lógica del año bisiesto radica en que el año astronómico no dura realmente 365 días, sino 365 días, 6 horas, 9 minutos y 9,76 segundos. Por ese motivo, se agrega un día más al año bisiesto, y una vez cada cuatro años tenemos un año de 366 con el agregado del día 29 al mes de febrero. El pico de los 9 minutos y 9,76 segundos, tambien hace que algunos años bisiestos sean eliminados.

Con todo esto, para el desarrollo de este código, y dado que parte de la función time(), número de segundos transcurridos desde las 0 horas el 1 de enero de 1970, se ha tenido que reconsiderar la duración del año en número de segundos. Así, un año de calendario tendría una duración de 31.536.000 segundos, mientras que un año astronómico tendría una duración de 31.558.149,76 segundos. Esta diferencia de 22.149,76 segundos son las 6 horas, 9 minutos y 9,76 segundos que se restan a cada año para que el cambio de año sea a las 0:00:00 horas del 1 de enero, y el motivo por el que cada cuatro años, se agrega un día más a ese año.

Este código también considera los meses con respecto a un año astronómico, y cada mes tiene 2.629.845,813 segundos (30,41666667 días de 24 horas exactas), mientras que un mes de 30 días tendría una duración de 2.592.000 segundos. Esto también afecta a los días, 86.400 segundos para un día de calendario, frente a 86.460,68427 segundos para un día astronómico. Esta variación se arrastra a las demás unidades de medida de tiempo, como las horas, que pasan a tener 3602.528511 segundos. Pero lo importante, es que el segundo permanece constante, que es lo que nos proporciona tanto la función time() como la función gmmktime().

Con estas correcciones de cara a los cálculos, se consigue la mayor precisión posible, al menos, la mejor que se me ha ocurrido.

Por otro lado, indicar que dado que time opera a partir del año 1970, los cálculos se realizan a partir de esa fecha, y para los años anteriores, se agrega el número de años anteriores a esa fecha mediante la variable $corg_anio.

Sin más, el código es el siguiente:

<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="iso-8859-1" />
<title>Calcular la edad.</title>
</head>

<body>
<H2>Introduce tu fecha de nacimiento.</H2>

<form method="POST" action="dif_fecha.php">

    <p>Día: <select size="1" name="dia"> 
            <option value="0">¿Dia?</option> 
            <option value="1">1</option> 
            <option value="2">2</option> 
            <option value="3">3</option> 
            <option value="4">4</option> 
            <option value="5">5</option> 
            <option value="6">6</option> 
            <option value="7">7</option> 
            <option value="8">8</option> 
            <option value="9">9</option> 
            <option value="10">10</option> 
            <option value="11">11</option> 
            <option value="12">12</option> 
            <option value="13">13</option> 
            <option value="14">14</option> 
            <option value="15">15</option> 
            <option value="16">16</option> 
            <option value="17">17</option> 
            <option value="18">18</option> 
            <option value="19">19</option> 
            <option value="20">20</option> 
            <option value="21">21</option> 
            <option value="22">22</option> 
            <option value="23">23</option> 
            <option value="24">24</option> 
            <option value="25">25</option> 
            <option value="26">26</option> 
            <option value="27">27</option> 
            <option value="28">28</option> 
            <option value="29">29</option> 
            <option value="30">30</option> 
            <option value="31">31</option> 
    </select>&nbsp;
    Mes: <select size="1" name="mes"> 
            <option value="0">¿Mes?</option> 
            <option value="1">Enero</option> 
            <option value="2">Febrero</option> 
            <option value="3">Marzo</option> 
            <option value="4">Abril</option> 
            <option value="5">Mayo</option> 
            <option value="6">Junio</option> 
            <option value="7">Julio</option> 
            <option value="8">Agosto</option> 
            <option value="9">Septiembre</option> 
            <option value="10">Octubre</option> 
            <option value="11">Noviembre</option> 
            <option value="12">Diciembre</option> 
    </select>&nbsp;
    
    Año: <input type="text" name="anio" size="20"></p>
    
    <p><input type="reset" value="Restablecer" name="B2">&nbsp; <input type="submit" value="Calcular edad" name="B1"></p>
</form>

<p>No es preciso que sea la fecha de nacimiento, tambien es valida cualquier otra fecha como 12 de octubre de 1492.</p>

</body>

</html>

---------------------- dif_fecha.php

<?php
/*

* gmmktime * nos da el numero de segundos transcurridos hasta una determinada fecha desde las 0 horas del 1 de enero de 1970
OJO, esta funcion no es exacta, ya que los años varian en duracion (bisiestos) y los meses no son igual de largos
Valido en GMT y el oeste, invalido en el este.

MUY IMPORTANTE: No poner ceros a la izquierda. Correcto "5", incorrecto "05"

Sintaxis mucho OJO:
gmmktime(hora, minuto, segundo, mes, dia, año)

Segundos para año de calendario, es decir, 365 dias

1 día    86400 seg. 
7 días     604800 seg. 
30 días    2592000 seg. 
365 días    31536000 seg.

Segundos para un año astronomico, es decir, 
365 días 6 horas 9 minutos 9,76 segundos

1 año      31558149.76 seg
1 mes     2629845.813 seg
1 dia       86460.68427 seg
1 hora     3602.528511 seg
*/

$dia $_POST["dia"];
$mes $_POST["mes"];
$anio $_POST["anio"];

    if (
$anio 1969
    { 
        
$tiemp_fecha gmmktime(1200$mes$dia$anio);
        
$corg_anio 0;
    } 
    else
    {
        
$tiemp_fecha gmmktime(1200$mes$dia1970);
        
$corg_anio 1970 $anio;
    }

        
$tiempo time();
        
        
$edad_segun $tiempo $tiemp_fecha;
        
        
$tiempo_anios = ($edad_segun 31558149.76) + $corg_anio;
        
$edad_anios floor($tiempo_anios);
        
$resto_anios $edad_segun 31558149.76;

        
$edad_segundos $tiempo_anios 31558149.76;
        
        
$tiempo_meses $resto_anios 2629845.813;
        
$edad_meses floor($tiempo_meses);
        
$resto_meses $resto_anios 2629845.813;
        
        
$tiempo_dias $resto_meses 86460.68427;
        
$edad_dias round($tiempo_dias,0);

echo 
"
    Segundos desde 01-01-1970: 
$tiempo <br />

    Edad en segundos: 
$edad_segundos <br />
    
    Años: 
$tiempo_anios <br />
    
    Meses: 
$tiempo_meses <br />
    
    Días: 
$tiempo_dias <br />
    <p>-------</p>
    
    Naciste el día 
$dia - $mes - $anio <br />
    Tienes 
$edad_anios años, $edad_meses meses y $edad_dias días.
"
;
?>

Código PHP