Я быстро получаю CMLogItem из запроса CoreMotion (это может быть акселерометр, гироскоп). Теперь я хочу получить метку времени этого образца, желательно в виде объекта Date (). CMLogItem имеют свойство .timestamp типа TimeInterval.
В документации говорится следующее:
The CMLogItem class defines a read-only timestamp property that records the time a motion-event measurement was taken.
Однако я не уверен, как преобразовать эту метку времени в объект Date (), потому что я не знаю, на что указывает метка времени.
В другой документации говорится:
The timestamp is the amount of time in seconds since the device booted.
Но это кажется действительно странным, и я не понимаю, почему Apple создала такой непоследовательный и сложный API.





Думаю, я разобрался. Здесь просто неверная документация. Это не «время в секундах с момента загрузки устройства» - это действительно время с их контрольной даты.
Исправить:
extension CMLogItem {
func startTime() -> Date {
#if os(watchOS)
return Date(timeIntervalSinceReferenceDate: self.timestamp)
#else
let systemRebootTime = Date(timeIntervalSinceNow: -ProcessInfo.processInfo.systemUptime)
return systemRebootTime.addingTimeInterval(self.timestamp)
#endif
}
}
Так, пожалуйста, объясните, как это неправильно? Временные метки кажутся относительными к контрольной дате 2001 года ?!
Это неверно, потому что timestamp на CMLogItem не относится к контрольной дате, которая является датой 1 января 2001 года, а относится ко времени загрузки устройства.
отредактировал код выше. это только на watchOS. на iOS, похоже, используется время с момента последнего перезапуска.
Это не работает, это дает огромные различия во времени. Более того, существует гораздо более сложная связь между отметкой времени в watchOS и iPhone. Вроде учитывает, как долго устройство находится в спящем режиме.
Хорошо, мое утверждение, что связь между отметками времени watchOS и iOS коррелирует с тем, как долго устройство находится в состоянии сна, НЕ ИСТИНА. У меня были и другие проблемы, связанные с загромождением очереди обработки и задержками обработчиков.
Правильный ответ:
extension CMLogItem {
static let bootTime = Date(timeIntervalSinceNow: -ProcessInfo.processInfo.systemUptime)
func startTime() -> Date {
return CMLogItem.bootTime.addingTimeInterval(self.timestamp)
}
}
Это дает нам стабильные, монотонные результаты, чего нельзя сказать о том, что bootTime вычисляется каждый раз при вызове startTime.
Ага, отличная идея! К вашему сведению, это только для iOS, в watchOS timeStamp рассчитывается по-другому: return Date(timeIntervalSinceReferenceDate: self.timestamp)
@ DeveloBär То, что вы говорите о watchOS, неверно, это не так. Я реализовал ваш подход и обнаружил, что разница между текущей меткой времени iPhone и текущей меткой времени watchOS составляет около 900000000 секунд.
неправильный. Date (timeIntervalSinceReferenceDate :) Создает значение даты, инициализированное относительно 00:00:00 UTC 1 января 2001 г. на заданное количество секунд.