【问题标题】:CMLogItem timestamp: Why so complicated?CMLogItem 时间戳:为什么这么复杂?
【发布时间】:2018-11-11 16:10:56
【问题描述】:

我从 swift 的 CoreMotion 查询中收到 CMLogItem(可能是加速度计、陀螺仪)。现在,我想获取该样本的时间戳,最好是作为 Date() 对象。 CMLogItems 有一个 .timestamp 类型为 TimeInterval 的属性。

文档告诉我以下内容:

CMLogItem 类定义了一个只读时间戳属性,该属性 记录进行运动事件测量的时间。

但是,我不确定如何将此时间戳转换为 Date() 对象,因为我不知道时间戳指的是什么。

另一个文档说:

时间戳是自设备启动以来的时间量(以秒为单位) 已启动。

但这看起来真的很奇怪,我不明白为什么苹果会创建如此不一致和复杂的 API。

【问题讨论】:

    标签: swift core-motion


    【解决方案1】:

    正确答案是:

    extension CMLogItem {
        static let bootTime = Date(timeIntervalSinceNow: -ProcessInfo.processInfo.systemUptime)
    
        func startTime() -> Date {
            return CMLogItem.bootTime.addingTimeInterval(self.timestamp)
        }
    }
    

    这为我们提供了稳定、单调的结果,这不是每次调用 startTime 时都会计算 bootTime 的情况。

    【讨论】:

    • 是的,这是个好主意!仅供参考,这仅适用于 iOS,在 watchOS 上,timeStamp 的计算方式不同:return Date(timeIntervalSinceReferenceDate: self.timestamp)
    • @DeveloBär 你所说的 watchOS 是错误的,它不是那样工作的。我实施了您的方法,发现当前 iPhone 时间戳和当前 watchOS 时间戳之间的差异约为 900,000,000 秒。
    【解决方案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: ) 创建一个相对于 2001 年 1 月 1 日 00:00:00 UTC 以给定秒数初始化的日期值。
    • 请详细说明这是怎么错的?时间戳似乎与 2001 年的参考日期有关?!
    • 这是错误的,因为 CMLogItem 上的 timestamp 与参考日期无关,即 2001 年 1 月 1 日的日期,而是相对于设备启动的时间。
    • 编辑了上面的代码。这仅在 watchOS 上。在 iOS 上,它似乎正在使用自上次重启以来的时间。
    • 这不起作用,它在时间上产生了巨大的差异。更重要的是,watchOS 和 iPhone 上的时间戳之间的关系要复杂得多。它似乎考虑了设备处于睡眠状态的时间。
    猜你喜欢
    • 2014-01-05
    • 2022-06-11
    • 2020-12-16
    • 1970-01-01
    • 1970-01-01
    • 2020-03-21
    • 2019-07-10
    • 1970-01-01
    • 2013-03-11
    相关资源
    最近更新 更多