用负值计算“timeIntervalSinceNow”(CLLocation 示例)?

Posted

技术标签:

【中文标题】用负值计算“timeIntervalSinceNow”(CLLocation 示例)?【英文标题】:calculating 'timeIntervalSinceNow' with a negative value (CLLocation example)? 【发布时间】:2012-04-03 01:56:18 【问题描述】:

我不明白文档中的这个例子:timeIntervalSinceNow 方法应该显示一个正值,但我们如何才能达到代码中提到的“5”? (我认为它或多或少是 0,或 -10、-20、-30 等......但我们怎样才能得到一个正值,比如 5?):

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation 
    // test the age of the location measurement to determine if the measurement is cached
    // in most cases you will not want to rely on cached measurements
    NSTimeInterval locationAge = -[newLocation.timestamp timeIntervalSinceNow];
    if (locationAge > 5.0) return;

感谢您的帮助

【问题讨论】:

【参考方案1】:

如果timeIntervalSinceNow 调用的结果是负数(意味着时间戳是过去的(在这种情况下,它总是如此)),它将被转换为正数。例如,-2.5 将变为 +2.5(反之亦然)。

然后您测试倒置符号值,看看它是否大于 5.0——在这种情况下,这意味着时间戳来自超过 5 秒之前。如果是,则您无需对位置数据进行任何操作,因为它太旧而无法使用。

就个人而言,我会在没有符号反转的情况下写这个,在测试中使用负数:

 if( [[newLocation timestamp] timeIntervalSinceNow] < -5.0 ) return;

【讨论】:

感谢 Iulius Cæsar,您将如何强制 cllocation 始终发送新位置而不是缓存位置? (不只是让应用程序在值被缓存的情况下什么都不做,而是告诉应用程序:“如果你有一个缓存的值,重新启动 cllocation”?) 你不能;它会尽快向您发送一个新的。你能做的就等着吧。 谢谢,我找不到默认缓存的时间?你知道吗? 定位硬件非常耗电,所以它只在请求时运行。当它关闭时,它会记录最后一个已知位置,因为没有理由不这样做。当它再次启动时,它拥有的第一个CLLocation 就是记录的值。找出它的年龄的唯一方法是检查它的时间戳。【参考方案2】:

这就是 NSDate 文档对 timeIntervalSinceNow 的看法:

接收者与当前日期和时间之间的间隔。如果接收者早于当前日期和时间,则返回值为负数。

在这种情况下,时间戳记录在过去,并且总是早于“现在”。另一方面,如果您使用 timeIntervalSince1970,结果将是肯定的。

【讨论】:

以上是关于用负值计算“timeIntervalSinceNow”(CLLocation 示例)?的主要内容,如果未能解决你的问题,请参考以下文章

ABAP选择屏幕字段无法输入负值

选择计算 SQL 的正/负值

java 练习递归..计算负值

来自 DFT/IDFT 计算的负值

拟合曲线时,R2值为负值表示啥意思

如何计算两个日期之间的月数和天数,而不在 SQL Server 中返回负值