2011-09-27 117 views
5

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

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

不幸的是,NSTimeInterval是自去年设备启动计算,冒充显著挑战原始形式使用它。

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

谢谢!

+0

'NSTimeInterval'通常是相对于参考日期。你从哪里得到这个相对于最后一次设备启动? –

+0

LOL在“亚毫秒”。 'NSTimeInterval'是一个具有53位精度的“double”,分辨率至少为1/2^52 *(自1/1/01以来的时间)。目前约为80纳秒。他们不仅没有获得任何*精度,而且手持式计算器在一分钟内会告诉他们,但现在不可能用其他任何东西,甚至10毫秒精度来可靠地校准时间戳。此外,我怀疑测量是在传感器芯片的闲置状态下进行的,而时间戳反映了内核处理数据的时间。真是一团糟。 – Potatoswatter

回答

14

将磁力计值与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; 
1

我想它应该被用作相对测量,以便您正确地对运动事件进行排序,所以它们尽可能轻量级地实施。

我想不出为什么你需要动作事件的实际日期和时间,因为它们几乎都是直接处理的。但是,如果你真的想,你必须得到一个事件的时间戳,用当前日期来计算基准日期,然后用你的基准日期来推导后续事件的实际时间。

+0

我很害怕。我希望稍后绘制动作事件,允许用户比较动作事件(Actigraphy应用程序)。这意味着更多的数学在我的部分:( –

+1

不太多.NSDate的dateByAddingTimeInterval将为你做大部分。 – jrturton