【问题标题】:NSTimeInterval to unix timestampNSTimeInterval 到 unix 时间戳
【发布时间】:2011-11-26 10:08:15
【问题描述】:

我从 CMMotionManager 获取 CMDeviceMotion 对象。 CMDeviceMotion 的属性之一是时间戳,它表示为 NSTimeInterval (double)。根据文档,这允许“亚毫秒”时间戳精度。

[motionManager startDeviceMotionUpdatesToQueue:motionQueue withHandler:^(CMDeviceMotion *motion, NSError *error) { 
  NSLog(@"Sample: %d Timestamp: %f ",counter,  motion.timestamp);
}

不幸的是,NSTimeInterval 是自上次设备启动后计算的,这给以原始形式使用它带来了重大挑战。

有没有人有工作代码可以将此 NSTimeInterval 转换为类似 Unix 的时间戳(UTC 时区)?

谢谢!

【问题讨论】:

  • NSTimeInterval 通常与参考日期相关。您从哪里得知这是与上次设备启动相关的?
  • LOL 在“亚毫秒”。 NSTimeInterval 是具有 53 位精度的 double,分辨率至少为 1/2^52 *(自 2001 年 1 月 1 日以来的时间)。目前大约需要 80 纳秒。他们不仅没有获得任何精度,就像手持计算器一分钟会告诉他们的那样,而且现在甚至不可能用任何其他精度来可靠地校准时间戳,甚至达到 10 毫秒的精度。此外,我怀疑测量是在传感器芯片空闲时进行的,而时间戳反映了内核何时开始处理数据。真是一团糟。
  • 只需查看文档,无论是在 Xcode 中还是在类参考中 - 它清楚地说明(复制)“时间戳是自设备启动以来的时间量,以秒为单位”。不是从参考时间开始。

标签: ios timestamp nstimeinterval core-motion


【解决方案1】:

在将磁力计值与 CoreMotion 事件进行比较时,我遇到了类似的问题。如果你想转换这些 NSTimeIntervals 你只需要计算一次偏移量:

// during initialisation

// Get NSTimeInterval of uptime i.e. the delta: now - bootTime
NSTimeInterval uptime = [NSProcessInfo processInfo].systemUptime;

// Now since 1970
NSTimeInterval nowTimeIntervalSince1970 = [[NSDate date] timeIntervalSince1970];

// Voila our offset
self.offset = nowTimeIntervalSince1970 - uptime;

【讨论】:

  • 2 个问题。你能直接减去这些时间间隔吗? systemUpTime 在文档中并未完全定义为“启动时间”m,而是“系统自上次重新启动以来一直处于唤醒状态的时间量。”。当系统没有“唤醒”(例如睡着等)时会出现间隙吗???
【解决方案2】:

我想它应该被用作一种相对度量,以允许您正确地对运动事件进行排序,因此它们尽可能地实现了轻量级。

我想不出你为什么需要运动事件的实际日期和时间,因为它们几乎都是立即处理的。但是,如果您真的想要,您必须获取一个事件的时间戳,将其与当前日期一起使用来计算基准日期,然后使用您的基准日期来推导出后续事件的实际时间。

【讨论】:

  • 我很害怕。我希望稍后绘制运动事件,允许用户比较运动事件(Actigraphy 应用程序)。这意味着我需要更多的数学知识:(
  • 不要太多。 NSDate 的 dateByAddingTimeInterval 将为您完成大部分工作。
猜你喜欢
  • 2013-03-23
  • 1970-01-01
  • 2010-10-02
  • 2010-11-19
  • 2018-01-04
  • 1970-01-01
  • 1970-01-01
  • 2021-02-12
  • 2013-06-03
相关资源
最近更新 更多