NSTimeInterval для отметки времени Unix

Я получаю объекты CMDeviceMotion из CMMotionManager. Одним из свойств CMDeviceMotion является отметка времени, которая выражается как NSTimeInterval (double). Это обеспечивает точность метки времени "менее миллисекунды", согласно документации.

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

К сожалению, NSTimeInterval рассчитывается с момента последней загрузки устройства, что создает значительные трудности при использовании его в необработанном виде.

У кого-нибудь есть рабочий код для преобразования этого NSTimeInterval в Unix-подобную временную метку (часовой пояс UTC)?

Спасибо!

2 ответа

Решение

У меня была похожая проблема при сравнении значений магнитометра с событиями 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;

Я предполагаю, что он должен использоваться как относительная мера, чтобы позволить вам правильно упорядочить события движения, чтобы они реализовали максимально легкую реализацию.

Я не могу понять, зачем вам нужны фактическая дата и время события движения, поскольку все они решаются практически сразу. Но если вы действительно этого хотите, вам нужно получить временную метку одного события, использовать ее с текущей датой для определения базовой даты, а затем использовать базовую дату для получения фактического времени последующих событий.

Другие вопросы по тегам