Poniéndole el lazo al calendario de MyFamilyServer (V2) incluí en el calendario la posibilidad de ver las temperaturas y precipitaciones previstas para los próximos días, el santo del día y también la fase en la que estará la luna.
Hoy escribo acerca del cálculo de la fase de la luna.
Solo os presento cálculo, ya que la presentación de la luna como un icono (una fuente) ya está explicado en publicaciones anteriores de este blog.
Me he basado únicamente en dos datos que (según mi información) son correctos y con esos dos datos he realizado todos los cálculos.
- Primer dato: Una fecha /hora en la que ha habido luna llena.
- Segundo dato: Cuánto tiempo dura un ciclo lunar completo.
Primer dato. Cuándo ha sido luna llena. He tomado la primera luna llena de 2016, Ha habido luna llena el 24 de enero de 2016 a las 02:46:20.
Segundo dato. Cuánto dura un ciclo lunar. Un ciclo lunar completo dura 29 días, 12 horas, 43 minutos y 12 segundos.
Con estos dos datos la cosa es sencilla, a partir del 24 de enero, cada 29 días y medio tendremos luna llena de nuevo.
Los cálculos los realizo en segundos, que es la forma natural de trabajar con fechas para el servidor.
El cálculo es el siguiente:
Ha habido luna llena el 24 de enero de 2016 a las 02:46:20
A partir de esta momento, cada 29 días, 12 horas, 43 minutos y 12 segundos sera de nuevo luna llena.
29 días en segundos es: 29 * 24 * 60 * 60 = 2.505.600
12 horas en segundos es: 12 * 60 * 60 = 43.200
43 minutos en segundos es: 43 * 60 = 2.580
12 segundos en segundos: 12 = 12
+ _____________
Resultado: Cada ciclo lunar son 2.551.392 segundos.
Debemos también conocer cuántos segundos han pasado desde el 24 de enero hasta la fecha en la que queremos conocer la fase lunar. Esto es una simple resta (recordar que estamos operando en segundos y obtenemos el resultado en segundos).
El resultado de esa resta es el número de segundos entre la luna llena que conocemos y la fecha actual. Ahora dividimos esa cantidad de segundos entre el tiempo que dura un ciclo lunar (también en segundos) y nos quedamos con el resto de la división. Con esa operación no sé (no me interesa) cuántos ciclos lunares completos han pasado pero SI sé cuánto tiempo en segundos ha pasado del ultimo ciclo lunar (el de la fecha que queremos conocer).
Supongamos que quiero dividir el ciclo lunar en 8 fases:
Luna-llena, Luna-gibosa-menguante, Cuarto-menguante, Luna-menguante, Luna-nueva, Luna-nueva-visible, Cuarto-creciente y Luna-gibosa-creciente.
A partir del resto de la división anterior, si el resto que he obtenido está comprendido entre 1 y 318.924 segundos estamos en la primera fase.
Si el resto que he obtenido está comprendido entre 318.925 y 637.858 estamos en la segunda fase.
Si el resto que he obtenido está comprendido entre 637.859 y 956.782 estamos en la tercera fase y así sucesivamente.
Básicamente esto es todo, hay una operación más que es restar algo de tiempo al inicio, ya tengo el momento exacto de luna llena del 24 de enero, debo restarle la mitad del tiempo de una fase (159.462 segundos) para considerar que la fase de luna llena comienza media fase antes y termina media fase después.
Ahora os muestro el código utilizado para el cálculo, curiosamente es más fácil codificarlo que explicarlo. Veréis que el código es sencillo.
function calcula_fase_lunar($fecha){
# $lunallena = mktime(hora, minuto, segundo, mes, dia , año );
$lunallena = mktime(02, 46, 20, 01, 24, 2016);
# 24 de enero de 2016 a las 02:46:20
# inicio de la luna llena es :
$iniciolunallena = $lunallena - 159462;
$fecha = strtotime($fecha);
$year = date('Y', $fecha);
$month = date('n', $fecha);
$day = date('j', $fecha);
$estanoche = mktime(23, 50, 00, $month, $day, $year);
# calculamos la luna que de esta noche. El dia entregado a las 23:50:00
$segundosentrelllen = $estanoche - $iniciolunallena;
# Segundos entre luna llena y esta noche
# resto de la division entre el tiempo de un ciclo y los segundos desde luna llena hasta ahora
$resto = $segundosentrelllen % 2551392;
# Si es entre 1 y 318924 - Primera fase
# Si es entre 318924 y 637858 - Segunda fase
# Si es entre 637858 y 956782 - Tercera fase y asi sucesivamente
for ($fase = 0; $fase <= 8; $fase++) {
if ($resto >= 318924) {
$resto = $resto - 318924;
} else {
break;
}
}
# ahora ponemos el calculo en letras (el array debe estar bien ordenado)
$fase_array = array(
'Luna-llena', 'Luna-gibosa-menguante', 'Cuarto-menguante', 'Luna-menguante',
'Luna-nueva', 'Luna-nueva-visible', 'Cuarto-creciente', 'Luna-gibosa-creciente'
);
$fase = $fase_array[$fase];
return $fase;
}
Es así de fácil, ya podéis calcular la fase lunar y utilizarla en cualquier sitio con un sencillo cálculo matemático.
La verdad es que no sé si hay desviaciones a largo plazo, yo lo he validado con fechas de los próximos 10 años y me ha resultado correcto. Si conocéis mejoras en el calculo, no dejéis de comentar.
No hay comentarios:
Publicar un comentario