Рассчитать время сна в HealthKit с помощью Swift - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть следующий код, который получает сумму часов сна. Тем не менее, он суммирует и спит вместе. Я пытаюсь получить сумму только за время сна.

fun c readSleepAnalysis (date: Date) {

    if let sleepType = HKObjectType.categoryType(forIdentifier: HKCategoryTypeIdentifier.sleepAnalysis) {

        let startDate = convertSleepStartDate(StartDate: date)
        let endDate = convertSleepEndDate(EndDate: date)
        let predicate = HKQuery.predicateForSamples(withStart: startDate, end: endDate, options: .strictStartDate)

        let sortDescriptor = NSSortDescriptor(key: HKSampleSortIdentifierEndDate, ascending: false)

        let query = HKSampleQuery(sampleType: sleepType, predicate: predicate, limit: 30, sortDescriptors: [sortDescriptor]) {
                                                    (query, samples, error) in

                                        guard
                                            error == nil,
                                        samples == samples as? [HKCategorySample] else {
                                                print("Something went wrong getting sleep analysis: \(String(describing: error))")
                                                return
                                        }

                                        let total = samples?.map(self.calculateSleepHours).reduce(0, {$0 + $1}) ?? 0
                                        DispatchQueue.main.async {
                                            self.userSleepMinutes = total
                                            print("userSleepHours = \(self.userSleepMinutes)")
                                        }

        }
        healthKit.execute(query)
    }
}

func calculateSleepHours(sample: HKSample) -> TimeInterval {

    let hours = sample.endDate.timeIntervalSince(sample.startDate) / 60 / 60

    return hours
}

Ранее я обнаружил, что Apple записывает все данные на основе по UT C. Имеет смысл! Однако это может работать для активной энергии и других подобных данных, но общее время сна не может быть рассчитано таким образом. Я рассчитываю общее время с 18:00 вечера до 5:59 утра того дня. Вот как я это делаю (может быть, есть лучший способ, но сейчас он мне не под силу).

func convertSleepStartDate(StartDate: Date) -> Date {

    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyy-MM-dd '18':'00':'01' +0000"
    let dateString = dateFormatter.string(from: StartDate)
    dateFormatter.dateFormat = "yyy-MM-dd HH:mm:ss +0000"
    let date = dateFormatter.date(from: dateString)
    let datePrior = Calendar.current.date(byAdding: .hour, value: -24, to: date!)
    print(datePrior as Any)

    return datePrior!
}

func convertSleepEndDate(EndDate: Date) -> Date {

    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyy-MM-dd '17':'59':'59' +0000"
    let dateString = dateFormatter.string(from: EndDate)
    dateFormatter.dateFormat = "yyy-MM-dd HH:mm:ss +0000"
    let date = dateFormatter.date(from: dateString)
    print(date as Any)

    return date!
}

Есть идеи?

...