2016-11-28 4 views
3

Я пытаюсь перевести библиотеку, написанную на Javascript, чтобы реализовать ее в Objective C для моего приложения iOS.iOS - Расчет Луны для Moonrise и Moonset

Ссылка на библиотеку JavaScript: https://github.com/mourner/suncalc

Я получил разные значения для восхода и захода.

Библиотека возвращается Javascript:

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

Моей цель возвращается реализация C:

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

я столкнулся вопрос с этой функцией:

// 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); 
} 

Моей целью реализации 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; 
} 

Я не вижу никаких ошибок, но мои значения ложны.

Тестовый пример:

Тест Мусор

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

д = 6175,947204432916

цель C Тест

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

d = 127900386826537.265625

Если вы что-то нашли, пожалуйста, дайте мне знать.

+0

Быстрый вопрос: 'toJulian:' возвращает тот же ответ, который, я думаю, нет. Затем попробуйте проверить каждую часть вашего расчета: «Дата.valueOf() 'получить то же самое, что' ([datetimeIntervalSince1970] * 1000) 'и т. д. – Larme

+0

Нет, это я сейчас изучаю. Я действительно не понимаю, это календарный юлианский/григорианский вопрос? – Balanced

+0

Я не использую JavaScript, но что должно возвращать 'date.valueOf()'? Насколько я понимаю, это миллисекунды от ...? 1970? У вас есть два значения выборки для него (один из них для 'date.valueOf()', а другой из '[datetimeIntervalSince1970]'? – Larme

ответ

2

Вопрос относится к определению #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; 
} 

Это переводится с:

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

Он просто заменить точно значения. Но ([date timeIntervalSince1970] * 1000)/1000 * 60 * 60 * 24 отличается от ([date timeIntervalSince1970] * 1000)/(1000 * 60 * 60 * 24).

Быстрое решение:

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

Или вы можете поставить скобку в #define:

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

Другое решение (я не очень нравится, #define), и вам не нужно скобки больше:

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

Итак, я думаю, что это то же самое для функции hoursLater? – Balanced

+0

Для 'double d = ([date timeIntervalSince1970] * 1000) + h * dayMS/24;' нет проблем, если вы не используете круглую скобку, потому что нет проблемы с приоритетом (*/vs + -). Но я настоятельно рекомендую использовать 'const double', чтобы избежать проблемы (как она рассчитывается). – Larme

 Смежные вопросы

  • Нет связанных вопросов^_^