iOS – Cálculo lunar para Moonrise y Moonset

Estoy intentando traducir una biblioteca escrita en Javascript para implementarla en Objective C para mi aplicación iOS.

El enlace a la biblioteca JavaScript: https://github.com/mourner/suncalc

Obtuve diferentes valores para Moonrise y Moonset.

La biblioteca Javascript vuelve:

moonrise = Mon Nov 28 2016 06:43:49 GMT+0100 (CET) moonset = Mon Nov 28 2016 17:10:33 GMT+0100 (CET) 

Mi implementación de Objective C vuelve:

 moonrise : 2016-11-28 02:00:00 +0000 moonset : 2016-11-28 01:00:00 +0000 

Me enfrento a un problema con estas funciones:

 // date/time constants and conversions var dayMs = 1000 * 60 * 60 * 24, J1970 = 2440588, J2000 = 2451545; function toJulian(date) { return date.valueOf() / dayMs - 0.5 + J1970; } function toDays(date) { return toJulian(date) - J2000; } function hoursLater(date, h) { return new Date(date.valueOf() + h * dayMs / 24); } 

Implementación de My Objective C:

 // date/time constants and conversions #define dayMS 1000 * 60 * 60 * 24 #define J1970 2440588 #define J2000 2451545 -(double)toJulian:(NSDate *) date { return ([date timeIntervalSince1970] * 1000) / dayMS - 0.5 + J1970; } -(double)toDays:(NSDate *) date { double tj = [self toJulian:date]; return tj - J2000; } -(NSDate *)hoursLater:(NSDate *) date :(int) h { double d = ([date timeIntervalSince1970] * 1000) + h * dayMS / 24; NSTimeInterval seconds = d / 1000; NSDate *newDate = [NSDate dateWithTimeIntervalSince1970:seconds]; return newDate; } 

No puedo ver ningún error, pero mis valores son falsos.

Ejemplo de testing:

Prueba Javascript

 var date = new Date(); var d = toDays(date); console.log("d = " + d); 

d = 6175.947204432916

Prueba del objective C

 NSDate *today = [NSDate date]; double d = [self toDays:today]; NSLog(@"d = %f", d); 

d = 127900386826537.265625

Si encuentras algo, avísame.

El problema está en la definición #define .

 #define dayMS 1000 * 60 * 60 * 24 #define J1970 2440588 #define J2000 2451545 -(double)toJulian:(NSDate *) date { return ([date timeIntervalSince1970] * 1000) / dayMS - 0.5 + J1970; } 

Esto se traduce con:

 -(double)toJulian:(NSDate *) date { return ([date timeIntervalSince1970] * 1000) / 1000 * 60 * 60 * 24 - 0.5 + 2440588; } 

Simplemente reemplaza exactamente los valores. Pero ([date timeIntervalSince1970] * 1000) / 1000 * 60 * 60 * 24 es diferente de ([date timeIntervalSince1970] * 1000) / (1000 * 60 * 60 * 24) .

Una solución rápida:

 return ([date timeIntervalSince1970] * 1000) / (dayMS) - 0.5 + J1970;` 

O puede poner el paréntesis en #define :

 #define dayMS (1000 * 60 * 60 * 24) 

Otra solución (no me gusta #define) y ya no necesita el paréntesis:

 const double dayMS = 1000 * 60 * 60 * 24;