如何使用 HealthKit 从特定日期准确获取 24 小时的睡眠数据?

How to get exactly 24 hours of sleep data from a specific date with HealthKit?

我熟悉获取睡眠数据的典型方法,但事实证明获取特定 24 小时的睡眠时间有点困难 window。

我可以设置一个谓词来获取在特定时间内开始或结束的样本,但很多时候这些样本会跨越日期界限。如果我晚上 10 点上床睡觉,早上 4 点起床,然后从早上 5 点睡到早上 8 点,很难确定 10-4 样本的范围以获取昨天的部分。

典型的谓词可能看起来像这样(使用以下日期扩展):

extension Date {
    var today: Date {
        return Calendar.current.date(byAdding: .day, value: 0, to: midnight)!
    }
    var yesterday: Date {
        return Calendar.current.date(byAdding: .day, value: -1, to: midnight)!
    }
}

let predicate = HKQuery.predicateForSamples(withStart: Date().yesterday, end: Date().today, options: [])

然后得到一个样本,做一些事情得到 seconds/minutes/hours:

let seconds = sample.endDate.timeIntervalSince(sample.startDate)

但是当开始日期不一定从昨天开始,或者结束日期不一定在今天之前,这会导致问题。

我可以开始围绕开始日期和结束日期做一些特殊的套管,但这有点复杂。有没有一种简单的方法来获取昨天的睡眠时间(从午夜到午夜的确切 24 小时 window)?我觉得我一定是误解了一些关于睡眠查询的基本知识,或者与此相关的时间数学。

HealthKit 无法插入 HKCategorySample 类型的查询结果。您的查询必须与您要使用的所有睡眠样本相匹配,并且您必须自己进行数学计算以计算出有多少样本落在您感兴趣的日期间隔内。