【问题标题】:How to turn CoreMotion timestamp into proper Date?如何将 CoreMotion 时间戳转换为正确的日期?
【发布时间】:2021-12-27 12:46:40
【问题描述】:

我正在寻找一种将 CoreMotion 事件中的时间戳转换为正确、高精度的“墙上日期时间”的方法。我想关联 iPhone 和 Apple Watch 上的事件,因此需要将这些时间戳转换为单个域。

我在互联网上测试了几种方法,例如:https://stackoverflow.com/a/53250802。这给出了完全错误的结果。

还有这个

extension TimeInterval {
    static var bootTime = Date().timeIntervalSince1970 - ProcessInfo.processInfo.systemUptime
    
    var unix: TimeInterval {
        return (TimeInterval. bootTime + self)
    }
}

这似乎一见钟情。我的测试表明,随着时间的推移,结果 unix TimeInterval 之间的差异越来越大:

在这张图片中,您可以看到收集事件的会话。单个会话事件具有相同的颜色。在上面,您会看到观看事件和在较低的电话事件上。我们看到 watchOS 上的时间戳似乎比 iPhone 上的进步慢。 这似乎时间戳可能与处理器周期数有关?

我的问题是:如何在 iPhone 和 watchOS 上以适当的方式将 CoreMotion 时间戳转换为 Date?

【问题讨论】:

  • 来自文档:“时间戳是设备启动后的秒数。”所以将它添加到启动时间应该会给你一个有效的日期,我可以想到一个不准确的原因。

标签: ios swift watchos core-motion


【解决方案1】:

这实际上是正确的解决方案。

extension TimeInterval {
    static var bootTime = Date().timeIntervalSince1970 - ProcessInfo.processInfo.systemUptime
    
    var unix: TimeInterval {
        return (TimeInterval. bootTime + self)
    }
}

watchOS 上时间戳滞后的问题与混乱的处理队列有关,因此事件处理程序随着时间的推移越来越滞后。出于某种原因,MotionManager 对 stopMotionDeviceUpdates() 没有反应,我一遍又一遍地得到这些,尽管事实上,我把它关掉了。我只是试图处理太多数据 - 我将传感器频率提高到 1/100。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-03
    • 2021-07-18
    • 2019-08-24
    • 2012-04-10
    • 2016-11-26
    • 2019-04-03
    相关资源
    最近更新 更多