Skip to content

Commit 7f650a2

Browse files
committed
Merge PR #621: Fix off-by-one in stats period start date and day count
2 parents d691b34 + 610e34e commit 7f650a2

5 files changed

Lines changed: 18 additions & 11 deletions

File tree

LoopFollow/Stats/AggregatedStatsView.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ struct AggregatedStatsView: View {
2828
let startOfToday = calendar.startOfDay(for: Date())
2929
let end = calendar.date(byAdding: .second, value: -1, to: startOfToday) ?? Date()
3030
let endDay = calendar.startOfDay(for: end)
31-
let startDay = calendar.date(byAdding: .day, value: -7, to: endDay) ?? endDay
31+
let startDay = calendar.date(byAdding: .day, value: -(7 - 1), to: endDay) ?? endDay
3232
let start = calendar.startOfDay(for: startDay)
3333
_startDate = State(initialValue: start)
3434
_endDate = State(initialValue: end)

LoopFollow/Stats/AggregatedStatsViewModel.swift

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,11 @@ class AggregatedStatsViewModel: ObservableObject {
3939
}
4040

4141
func updatePeriod(_ days: Int, completion: @escaping () -> Void = {}) {
42-
let endDate = Date()
43-
let startDate = dateTimeUtils.displayCalendar().date(byAdding: .day, value: -days, to: endDate) ?? endDate
42+
let calendar = dateTimeUtils.displayCalendar()
43+
let startOfToday = calendar.startOfDay(for: Date())
44+
let endDate = calendar.date(byAdding: .second, value: -1, to: startOfToday) ?? Date()
45+
let endDayStart = calendar.startOfDay(for: endDate)
46+
let startDate = calendar.date(byAdding: .day, value: -(days - 1), to: endDayStart) ?? endDayStart
4447
updateDateRange(start: startDate, end: endDate, completion: completion)
4548
}
4649

LoopFollow/Stats/DateRangePicker.swift

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,9 @@ struct DateRangePicker: View {
3131

3232
private var dayCount: Int {
3333
let calendar = dateTimeUtils.displayCalendar()
34-
return calendar.dateComponents([.day], from: startDate, to: endDate).day ?? 0
34+
let startDay = calendar.startOfDay(for: startDate)
35+
let endDay = calendar.startOfDay(for: endDate)
36+
return (calendar.dateComponents([.day], from: startDay, to: endDay).day ?? 0) + 1
3537
}
3638

3739
private var lastFullDay: Date {
@@ -241,7 +243,7 @@ struct DateRangePicker: View {
241243
let calendar = dateTimeUtils.displayCalendar()
242244
endDate = lastFullDay
243245
let endDayStart = calendar.startOfDay(for: endDate)
244-
let startDayStart = calendar.date(byAdding: .day, value: -days, to: endDayStart) ?? endDayStart
246+
let startDayStart = calendar.date(byAdding: .day, value: -(days - 1), to: endDayStart) ?? endDayStart
245247
startDate = calendar.startOfDay(for: startDayStart)
246248
showStartDatePicker = false
247249
showEndDatePicker = false

LoopFollow/Stats/SimpleStatsViewModel.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ class SimpleStatsViewModel: ObservableObject {
6666
let smbTotal = smbInPeriod.reduce(0.0) { $0 + $1.value }
6767
let totalBolusInPeriod = bolusTotal + smbTotal
6868

69-
let cutoffTime = Date().timeIntervalSince1970 - (Double(dataService.daysToAnalyze) * 24 * 60 * 60)
69+
let cutoffTime = dataService.startDate.timeIntervalSince1970
7070
let allBolusDates = (bolusesInPeriod + smbInPeriod).map { $0.date }.filter { $0 >= cutoffTime }
7171
let actualDays = calculateActualDaysCovered(dates: allBolusDates, requestedDays: dataService.daysToAnalyze)
7272

@@ -93,7 +93,7 @@ class SimpleStatsViewModel: ObservableObject {
9393

9494
let totalCarbsInPeriod = dailyCarbs.values.reduce(0.0, +)
9595

96-
let daysWithData = max(dailyCarbs.count, 1)
96+
let daysWithData = dataService.daysToAnalyze
9797

9898
if daysWithData > 0 {
9999
avgCarbs = totalCarbsInPeriod / Double(daysWithData)
@@ -295,7 +295,7 @@ class SimpleStatsViewModel: ObservableObject {
295295
guard !dates.isEmpty else { return requestedDays }
296296

297297
let calendar = dateTimeUtils.displayCalendar()
298-
let cutoffTime = Date().timeIntervalSince1970 - (Double(requestedDays) * 24 * 60 * 60)
298+
let cutoffTime = dataService.startDate.timeIntervalSince1970
299299
let filteredDates = dates.filter { $0 >= cutoffTime }
300300

301301
var uniqueDays = Set<Date>()

LoopFollow/Stats/StatsDataService.swift

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,11 @@ class StatsDataService {
3232
func updateDateRange(start: Date, end: Date) {
3333
startDate = start
3434
endDate = end
35-
// Also update daysToAnalyze for compatibility with existing code
36-
let daysBetween = dateTimeUtils.displayCalendar().dateComponents([.day], from: start, to: end).day ?? 14
37-
daysToAnalyze = max(daysBetween, 1)
35+
let calendar = dateTimeUtils.displayCalendar()
36+
let startDay = calendar.startOfDay(for: start)
37+
let endDay = calendar.startOfDay(for: end)
38+
let daysBetween = calendar.dateComponents([.day], from: startDay, to: endDay).day ?? 13
39+
daysToAnalyze = daysBetween + 1
3840
}
3941

4042
func ensureDataAvailable(onProgress: @escaping () -> Void, completion: @escaping () -> Void) {

0 commit comments

Comments
 (0)