Skip to content

Commit 2393a6b

Browse files
authored
fix recurrence nanosecond handling for nanosecond values > 0.5 (#1320)
Thank you!
1 parent cb06baa commit 2393a6b

File tree

2 files changed

+15
-10
lines changed

2 files changed

+15
-10
lines changed

Sources/FoundationEssentials/Calendar/Calendar_Recurrence.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@ extension Calendar {
235235
}
236236
var componentsForEnumerating = recurrence.calendar._dateComponents(components, from: start)
237237

238-
startDateNanoseconds = start.timeIntervalSince1970.remainder(dividingBy: 1)
238+
startDateNanoseconds = start.timeIntervalSinceReferenceDate.truncatingRemainder(dividingBy: 1)
239239

240240
let expansionChangesDay = dayOfYearAction == .expand || dayOfMonthAction == .expand || weekAction == .expand || weekdayAction == .expand
241241
let expansionChangesMonth = dayOfYearAction == .expand || monthAction == .expand || weekAction == .expand

Tests/FoundationEssentialsTests/GregorianCalendarRecurrenceRuleTests.swift

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -805,14 +805,19 @@ final class GregorianCalendarRecurrenceRuleTests: XCTestCase {
805805
}
806806

807807
func testDailyRecurrenceRuleWithNonzeroNanosecondComponent() {
808-
let start = Date(timeIntervalSince1970: 1746627600.5) // 2025-05-07T07:20:00.500-07:00
809-
let rule = Calendar.RecurrenceRule.daily(calendar: gregorian, end: .afterOccurrences(2))
810-
let results = Array(rule.recurrences(of: start))
811-
812-
let expectedResults: [Date] = [
813-
start,
814-
Date(timeIntervalSince1970: 1746714000.5), // 2025-05-08T07:20:00.500-07:00
815-
]
816-
XCTAssertEqual(results, expectedResults)
808+
let referenceStart = Date(timeIntervalSinceReferenceDate: 1746627600) // 2025-05-07T07:20:00.000-07:00
809+
let referenceEnd = Date(timeIntervalSinceReferenceDate: 1746714000) // 2025-05-08T07:20:00.000-07:00
810+
811+
for nsec in stride(from: 0, through: 1, by: 0.05) {
812+
let start = referenceStart.addingTimeInterval(nsec)
813+
let rule = Calendar.RecurrenceRule.daily(calendar: gregorian, end: .afterOccurrences(2))
814+
let results = Array(rule.recurrences(of: start))
815+
816+
let expectedResults: [Date] = [
817+
start,
818+
referenceEnd.addingTimeInterval(nsec)
819+
]
820+
XCTAssertEqual(results, expectedResults, "Failed for nanoseconds \(nsec)")
821+
}
817822
}
818823
}

0 commit comments

Comments
 (0)