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

Posted

技术标签:

【中文标题】如何使用 HealthKit 从特定日期准确获取 24 小时的睡眠数据?【英文标题】:How to get exactly 24 hours of sleep data from a specific date with HealthKit? 【发布时间】:2018-01-24 01:44:58 【问题描述】:

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

我可以设置一个谓词来获取在特定时间内开始或结束的样本,但很多时候这些样本会跨越日期边界。如果我晚上 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: [])

然后获取一个样本,并做一些事情来获取秒/分钟/小时:

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

但是当开始日期不一定是昨天,或者结束日期不一定早于今天时,这会导致问题。

我可以开始在开始日期和结束日期周围做一些特殊的大小写,但它会变得有些复杂。有没有一种简单的方法可以让昨天的睡眠时间(从午夜到午夜的确切 24 小时窗口)?我觉得我一定是误解了一些关于睡眠查询的基本知识,或者围绕这个的时间数学。

【问题讨论】:

【参考方案1】:

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

【讨论】:

以上是关于如何使用 HealthKit 从特定日期准确获取 24 小时的睡眠数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取以前日期的 HealthKit 总步数

如何获取以前日期的 HealthKit 总步数

如何从 HealthKit 获取元数据?

从 HealthKit 获取昨天的步骤

如何快速从 HealthKit 中获取氧饱和度?

如何快速从 HealthKit 中获取氧饱和度?