CMLogItem时间戳:为什么这么复杂?

问题描述 投票:0回答:3

我从 swift 中的 CoreMotion 查询中收到一个

CMLogItem
(可能是加速度计、陀螺仪)。现在,我想获取该样本的时间戳,最好是 Date() 对象。
CMLogItem
具有
.timestamp
类型的属性
TimeInterval

文档告诉我以下内容:

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

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

另一个文档说:

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

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

swift core-motion
3个回答
7
投票

正确答案是:

extension CMLogItem {
    static let bootTime = Date(timeIntervalSinceNow: -ProcessInfo.processInfo.systemUptime)

    func startTime() -> Date {
        return CMLogItem.bootTime.addingTimeInterval(self.timestamp)
    }
}

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


0
投票

在我的测试中它似乎有效。从 TimeInterval 创建了扩展。不要紧。也在 Apple Watch 上工作。 通过验证 https://www.epochconverter.com

中的输出进行测试
extension TimeInterval {
    static let bootTime = Date(timeIntervalSinceNow: -ProcessInfo.processInfo.systemUptime)

    func startTime() -> Date {
        return TimeInterval.bootTime.addingTimeInterval(self)
    }
    
    func startTimeInterval() -> TimeInterval {
        return startTime().timeIntervalSince1970
    }
}

-1
投票

我想我已经明白了。 这里的文档是错误的。 这不是“自设备启动以来的时间(以秒为单位)”——它确实是自参考日期以来的时间。

修复:

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
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.