iOS - 月出和月落的月亮计算
iOS - Moon Calculation for Moonrise and Moonset
我正在尝试翻译一个用 Javascript 编写的库,以便在 Objective C 中为我的 iOS 应用程序实现它。
link 到 JavaScript 库:https://github.com/mourner/suncalc
我得到了月出和月落的不同值。
Javascript 库 returns :
moonrise = Mon Nov 28 2016 06:43:49 GMT+0100 (CET)
moonset = Mon Nov 28 2016 17:10:33 GMT+0100 (CET)
我的 Objective C 实现 returns :
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);
}
我的 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;
}
我看不出任何错误,但我的值是错误的。
测试示例:
Javascript 测试
var date = new Date();
var d = toDays(date);
console.log("d = " + d);
d = 6175.947204432916
Objective C 测试
NSDate *today = [NSDate date];
double d = [self toDays:today];
NSLog(@"d = %f", d);
d = 127900386826537.265625
如果你找到了什么,请告诉我。
问题出在 #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;
我正在尝试翻译一个用 Javascript 编写的库,以便在 Objective C 中为我的 iOS 应用程序实现它。
link 到 JavaScript 库:https://github.com/mourner/suncalc
我得到了月出和月落的不同值。
Javascript 库 returns :
moonrise = Mon Nov 28 2016 06:43:49 GMT+0100 (CET)
moonset = Mon Nov 28 2016 17:10:33 GMT+0100 (CET)
我的 Objective C 实现 returns :
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);
}
我的 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;
}
我看不出任何错误,但我的值是错误的。
测试示例:
Javascript 测试
var date = new Date();
var d = toDays(date);
console.log("d = " + d);
d = 6175.947204432916
Objective C 测试
NSDate *today = [NSDate date];
double d = [self toDays:today];
NSLog(@"d = %f", d);
d = 127900386826537.265625
如果你找到了什么,请告诉我。
问题出在 #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;