NSTimeInterval to unix timestamp

2019-02-13 20:10发布

I'm getting CMDeviceMotion objects from CMMotionManager. One of the properties of the CMDeviceMotion is timestamp, which is expressed as a NSTimeInterval (double). This allows for "sub millisecond" timestamp precision, according to documentation.

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

Unfortunately, NSTimeInterval is calculated since last device boot, posing significant challenges to using it in its raw form.

Does anyone have a working code to convert this NSTimeInterval into a Unix like timestamp (UTC timezone)?

Thank you!

2条回答
三岁会撩人
2楼-- · 2019-02-13 20:37

I had a similar problem when comparing magnetometer values with CoreMotion events. If you want to transform these NSTimeIntervals you just need to calculate the offset once:

// 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;
查看更多
干净又极端
3楼-- · 2019-02-13 20:37

I imagine it is supposed to be used as a relative measure to allow you to sequence motion events correctly, so they went for as lightweight an implementation as possible.

I can't think why you'd need the actual date and time of a motion event as they are all dealt with pretty much straight away. But if you really wanted to, you'd have to get the timestamp of one event, use that with the current date to work out the base date, and then use your base date to derive the actual time of subsequent events.

查看更多
登录 后发表回答