Редактировать : Пожалуйста, смотрите ответ Николя Локена. Согласно комментариям, следующее решение не корректно , но сохраняется здесь для истории (и потому что я не могу удалить его, так как оно в настоящее время помечено как принятое).
Свойство timestamp
является NSTimeInterval
, поэтому вы должны иметь возможность:
NSLog(@"Motion at time: %@",
[NSDate dateWithTimeIntervalSinceReferenceDate:devicemotion.timestamp]);
NSTimeInterval
это просто typedef'd double
тип, так что вы можете использовать %f
вместо %@
и регистрировать его напрямую.
Кроме того, в документах не указано, установлена ли эта временная метка в отношении контрольной даты Apple или стандартной * nix-даты, поэтому вам может потребоваться использовать [NSDate dateWithTimeIntervalSince1970:]
, если вышеупомянутый метод возвращает даты в далеком будущем.
Поскольку @davidbitton предположил, что CMDeviceMotion
timestamp
относится к последней загрузке устройства, правильное значение NSDate
может быть получено с помощью
NSDate *startupTime = [NSDate dateWithTimeIntervalSinceNow:
-1 * [[NSProcessInfo processInfo] systemUptime]];
NSDate *deviceMotionDate = [NSDate dateWithTimeInterval:devicemotion.timestamp
sinceDate:startupTime];
Это должно дать примерно точный NSDate
объект, предполагая, что @davidbitton верен. (ссылка: NSProcessInfo -systemUptime )
Однако, учитывая, насколько это сложно, я бы сейчас предложил для простоты, учитывая природу свойства timestamp
, чтобы вы записали его в строку формата как что-то вроде
"... event logged at %0.2f seconds since startup...", devicemotion.timestamp