如何基于HealthKit获取的睡眠数据计算睡眠时长
实现方案
你拿到的HealthKit睡眠样本均为带时区偏移的ISO 8601标准时间格式,用moment可以直接解析计算,无需额外做格式转换:
- 首先按需求过滤睡眠类型,HealthKit的睡眠数据分为
INBED(卧床时长)和ASLEEP(实际睡眠时长)两类,可通过value字段筛选:
// 示例:筛选所有卧床记录 const targetRecords = results.filter(item => item.value === 'INBED')
- 用
moment.diff方法计算单条记录的时间差,支持自定义返回单位:
const getRecordDuration = (record) => { const start = moment(record.startDate) const end = moment(record.endDate) // 以小时为单位,保留小数位,传入false则返回整数小时 return end.diff(start, 'hours', true) // 若需返回分钟单位,改为 end.diff(start, 'minutes') }
- 累加所有记录的时长得到总时长:
const totalDuration = targetRecords.reduce((sum, record) => { return sum + getRecordDuration(record) }, 0)
注意事项
- moment会自动识别时间字符串的时区偏移,无需手动处理跨时区、跨天的计算逻辑,示例中22点到次日9点的记录计算结果会直接返回11小时
- 若你需要分别统计深浅睡时长,可查看HealthKit返回样本的额外分类字段,不同设备上报的分类维度可能有差异,可按需调整过滤规则
内容的提问来源于stack exchange,提问作者Daniel Döbereiner
相关产品推荐
相关产品推荐

