我从 swift 中的 CoreMotion 查询中收到一个
CMLogItem
(可能是加速度计、陀螺仪)。现在,我想获取该样本的时间戳,最好是 Date() 对象。 CMLogItem
具有 .timestamp
类型的属性 TimeInterval
。
文档告诉我以下内容:
CMLogItem 类定义了一个只读时间戳属性, 记录进行运动事件测量的时间。
但是,我不确定如何将此时间戳转换为 Date() 对象,因为我不知道时间戳指的是什么。
另一个文档说:
时间戳是自设备发出以来的时间量(以秒为单位) 已启动。
但这看起来真的很奇怪,我不明白为什么苹果会创建如此不一致且复杂的 API。
正确答案是:
extension CMLogItem {
static let bootTime = Date(timeIntervalSinceNow: -ProcessInfo.processInfo.systemUptime)
func startTime() -> Date {
return CMLogItem.bootTime.addingTimeInterval(self.timestamp)
}
}
这为我们提供了稳定、单调的结果,而每次调用 startTime 时都会计算 bootTime 时,情况并非如此。
在我的测试中它似乎有效。从 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
}
}
我想我已经明白了。 这里的文档是错误的。 这不是“自设备启动以来的时间(以秒为单位)”——它确实是自参考日期以来的时间。
修复:
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
}
}