Jonas Björkert 1 год назад
Родитель
Сommit
30367eb84d

+ 2 - 0
LoopFollow/Controllers/Nightscout/NSProfile.swift

@@ -42,6 +42,8 @@ struct NSProfile: Decodable {
         let target_high: [TargetEntry]?
         let target_low: [TargetEntry]?
         let timezone: String
+
+        let units: String
     }
 
     let store: [String: Store]

+ 39 - 9
LoopFollow/Controllers/Nightscout/ProfileManager.swift

@@ -14,7 +14,7 @@ struct ProfileManager {
     var targetHighSchedule: [TimeValue<HKQuantity>]
     var overrides: [Override]
     var units: HKUnit
-    var timezone: String
+    var timezone: TimeZone
     var defaultProfile: String
 
     struct TimeValue<T> {
@@ -38,19 +38,20 @@ struct ProfileManager {
         self.targetHighSchedule = []
         self.overrides = []
         self.units = .millimolesPerLiter
-        self.timezone = "UTC"
+        self.timezone = TimeZone.current
         self.defaultProfile = ""
     }
 
     mutating func loadProfile(from profileData: NSProfile) {
-        guard let store = profileData.store["default"] ?? profileData.store["Default"] else {
+        guard let store = profileData.store[profileData.defaultProfile] else {
             return
         }
 
-        self.units = profileData.units.lowercased() == "mg/dl" ? .milligramsPerDeciliter : .millimolesPerLiter
-        self.timezone = store.timezone
+        self.units = store.units.lowercased() == "mg/dl" ? .milligramsPerDeciliter : .millimolesPerLiter
         self.defaultProfile = profileData.defaultProfile
 
+        self.timezone = getTimeZone(from: store.timezone)
+
         self.isfSchedule = store.sens.map { TimeValue(timeAsSeconds: Int($0.timeAsSeconds), value: HKQuantity(unit: self.units, doubleValue: $0.value)) }
         self.basalSchedule = store.basal.map { TimeValue(timeAsSeconds: Int($0.timeAsSeconds), value: $0.value) }
         self.carbRatioSchedule = store.carbratio.map { TimeValue(timeAsSeconds: Int($0.timeAsSeconds), value: $0.value) }
@@ -66,7 +67,7 @@ struct ProfileManager {
     func currentISF() -> HKQuantity? {
         return getCurrentValue(from: isfSchedule)
     }
-    
+
     func currentBasal() -> String? {
         if let basal = getCurrentValue(from: basalSchedule) {
             return Localizer.formatToLocalizedString(basal, maxFractionDigits: 2, minFractionDigits: 0)
@@ -90,7 +91,9 @@ struct ProfileManager {
         guard !schedule.isEmpty else { return nil }
 
         let now = Date()
-        let calendar = Calendar.current
+        var calendar = Calendar.current
+        calendar.timeZone = self.timezone
+
         let currentTimeInSeconds = calendar.component(.hour, from: now) * 3600 +
         calendar.component(.minute, from: now) * 60 +
         calendar.component(.second, from: now)
@@ -106,6 +109,33 @@ struct ProfileManager {
         return lastValue
     }
 
+    private func getTimeZone(from identifier: String) -> TimeZone {
+        if let timeZone = TimeZone(identifier: identifier) {
+            return timeZone
+        }
+
+        let adjustedIdentifier = identifier.replacingOccurrences(of: "ETC/", with: "Etc/")
+        if let timeZone = TimeZone(identifier: adjustedIdentifier) {
+            return timeZone
+        }
+
+        if identifier.uppercased().contains("GMT") {
+            let components = identifier.uppercased().components(separatedBy: "GMT")
+            if components.count > 1 {
+                let offsetString = components[1]
+                if let offsetHours = Int(offsetString) {
+                    let correctedOffsetHours = -offsetHours
+                    let secondsFromGMT = correctedOffsetHours * 3600
+                    if let timeZone = TimeZone(secondsFromGMT: secondsFromGMT) {
+                        return timeZone
+                    }
+                }
+            }
+        }
+
+        return TimeZone.current
+    }
+
     mutating func clear() {
         self.isfSchedule = []
         self.basalSchedule = []
@@ -113,8 +143,8 @@ struct ProfileManager {
         self.targetLowSchedule = []
         self.targetHighSchedule = []
         self.overrides = []
-        self.units = HKUnit.millimolesPerLiter
-        self.timezone = "UTC"
+        self.units = .millimolesPerLiter
+        self.timezone = TimeZone.current
         self.defaultProfile = ""
     }
 }