CMLogItem timestamp: почему так сложно?

Я быстро получаю 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.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
0
403
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Думаю, я разобрался. Здесь просто неверная документация. Это не «время в секундах с момента загрузки устройства» - это действительно время с их контрольной даты.

Исправить:

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
    }
}

неправильный. Date (timeIntervalSinceReferenceDate :) Создает значение даты, инициализированное относительно 00:00:00 UTC 1 января 2001 г. на заданное количество секунд.

Hogdotmac 21.11.2019 14:19

Так, пожалуйста, объясните, как это неправильно? Временные метки кажутся относительными к контрольной дате 2001 года ?!

DeveloBär 22.11.2019 15:31

Это неверно, потому что timestamp на CMLogItem не относится к контрольной дате, которая является датой 1 января 2001 года, а относится ко времени загрузки устройства.

Legoless 01.01.2021 19:23

отредактировал код выше. это только на watchOS. на iOS, похоже, используется время с момента последнего перезапуска.

DeveloBär 31.05.2021 18:01

Это не работает, это дает огромные различия во времени. Более того, существует гораздо более сложная связь между отметкой времени в watchOS и iPhone. Вроде учитывает, как долго устройство находится в спящем режиме.

omikron 16.11.2021 12:59

Хорошо, мое утверждение, что связь между отметками времени watchOS и iOS коррелирует с тем, как долго устройство находится в состоянии сна, НЕ ИСТИНА. У меня были и другие проблемы, связанные с загромождением очереди обработки и задержками обработчиков.

omikron 17.11.2021 10:20
Ответ принят как подходящий

Правильный ответ:

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 17.11.2021 11:28

@ DeveloBär То, что вы говорите о watchOS, неверно, это не так. Я реализовал ваш подход и обнаружил, что разница между текущей меткой времени iPhone и текущей меткой времени watchOS составляет около 900000000 секунд.

omikron 17.11.2021 16:16

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