func retrieveSleep(completion: @escaping (String) -> ()) { let startDateString = "2020-09-22 00:00:00" let endDateString = "2020-09-22 23:59:59"
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
let startDate = dateFormatter.date(from: startDateString) let endDate = dateFormatter.date(from: endDateString) let predicate = HKQuery.predicateForSamples(withStart: startDate, end: endDate, options: HKQueryOptions.strictEndDate) // first, we define the object type we want if let sleepType = HKObjectType.categoryType(forIdentifier: HKCategoryTypeIdentifier.sleepAnalysis) { // Use a sortDescriptor to get the recent data first let sortDescriptor = NSSortDescriptor(key: HKSampleSortIdentifierEndDate, ascending: false) // we create our query with a block completion to execute let query = HKSampleQuery(sampleType: sleepType, predicate: predicate, limit: HKObjectQueryNoLimit, sortDescriptors: [sortDescriptor]) { (query, tmpResult, error) -> Void in if error != nil { return } var totalSeconds : Double = 0 if let result = tmpResult { for item in result { if let sample = item as? HKCategorySample { let timeInterval = sample.endDate.timeIntervalSince(sample.startDate) totalSeconds = totalSeconds + timeInterval } } } let result = String(Int(totalSeconds / 3600)) + "小时 " + String(Int(totalSeconds.truncatingRemainder(dividingBy: 3600) / 60)) + "分 " + String(Int(totalSeconds.truncatingRemainder(dividingBy: 3600) .truncatingRemainder(dividingBy: 60))) + "秒" completion(result) } // finally, we execute our query healthStore.execute(query) } }