【问题标题】:iOS - Moon Calculation for Moonrise and MoonsetiOS - 月出和月落的月亮计算
【发布时间】:2017-04-12 01:31:24
【问题描述】:

我正在尝试翻译一个用 Javascript 编写的库,以便在我的 iOS 应用程序的 Objective C 中实现它。

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)

我的 Objective 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;
}

我看不到任何错误,但我的价值观是错误的。

测试示例:

Javascript 测试

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

d = 6175.947204432916

目标 C 测试

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

d = 127900386826537.265625

如果你发现了什么,请告诉我。

【问题讨论】:

  • 快速问题:toJulian: 是否返回相同的响应,我猜不是。然后尝试检查计算的每个部分:date.valueOf() 是否与([date timeIntervalSince1970] * 1000) 相同,等等。
  • 不,这是我目前正在调查的地方。我真的不明白,这是日历儒略/格里高利问题吗?
  • 我不使用 JavaScript,但是应该返回什么 date.valueOf()?根据我的猜测,它是从...开始的毫秒数? 1970 年?你有两个样本值吗(一个来自date.valueOf(),另一个来自[date timeIntervalSince1970]
  • date.valueOf() 从 1970 年开始以毫秒为单位返回时间是的。 Javascript的值= 1480337462728(今天日期)timeInterval1970 = 1480337462320.203125(今天日期)到朱利安Javascript = 2457721.0354482406到朱利安目标C = 127901159185053.062500
  • 怎么会有不同的值呢?这只是常量值!

标签: javascript ios objective-c xcode nsdate


【解决方案1】:

问题在于#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;

【讨论】:

  • 所以我猜这对于 hoursLater 函数是一样的?
  • double d = ([date timeIntervalSince1970] * 1000) + h * dayMS / 24; 不使用括号没有问题,因为优先级没有问题(*/ vs +-)。但我强烈建议使用const double 来避免这个问题(因为它是计算出来的)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-13
  • 2010-11-02
  • 1970-01-01
  • 1970-01-01
  • 2012-07-25
  • 1970-01-01
相关资源
最近更新 更多