diff --git a/Sources/FoundationEssentials/Calendar/Calendar_Recurrence.swift b/Sources/FoundationEssentials/Calendar/Calendar_Recurrence.swift index 173558761..dd8740236 100644 --- a/Sources/FoundationEssentials/Calendar/Calendar_Recurrence.swift +++ b/Sources/FoundationEssentials/Calendar/Calendar_Recurrence.swift @@ -235,7 +235,7 @@ extension Calendar { } var componentsForEnumerating = recurrence.calendar._dateComponents(components, from: start) - startDateNanoseconds = start.timeIntervalSince1970.remainder(dividingBy: 1) + startDateNanoseconds = start.timeIntervalSinceReferenceDate.truncatingRemainder(dividingBy: 1) let expansionChangesDay = dayOfYearAction == .expand || dayOfMonthAction == .expand || weekAction == .expand || weekdayAction == .expand let expansionChangesMonth = dayOfYearAction == .expand || monthAction == .expand || weekAction == .expand diff --git a/Tests/FoundationEssentialsTests/GregorianCalendarRecurrenceRuleTests.swift b/Tests/FoundationEssentialsTests/GregorianCalendarRecurrenceRuleTests.swift index 112a4c45e..8b6e8e69d 100644 --- a/Tests/FoundationEssentialsTests/GregorianCalendarRecurrenceRuleTests.swift +++ b/Tests/FoundationEssentialsTests/GregorianCalendarRecurrenceRuleTests.swift @@ -805,14 +805,19 @@ final class GregorianCalendarRecurrenceRuleTests: XCTestCase { } func testDailyRecurrenceRuleWithNonzeroNanosecondComponent() { - let start = Date(timeIntervalSince1970: 1746627600.5) // 2025-05-07T07:20:00.500-07:00 - let rule = Calendar.RecurrenceRule.daily(calendar: gregorian, end: .afterOccurrences(2)) - let results = Array(rule.recurrences(of: start)) - - let expectedResults: [Date] = [ - start, - Date(timeIntervalSince1970: 1746714000.5), // 2025-05-08T07:20:00.500-07:00 - ] - XCTAssertEqual(results, expectedResults) + let referenceStart = Date(timeIntervalSinceReferenceDate: 1746627600) // 2025-05-07T07:20:00.000-07:00 + let referenceEnd = Date(timeIntervalSinceReferenceDate: 1746714000) // 2025-05-08T07:20:00.000-07:00 + + for nsec in stride(from: 0, through: 1, by: 0.05) { + let start = referenceStart.addingTimeInterval(nsec) + let rule = Calendar.RecurrenceRule.daily(calendar: gregorian, end: .afterOccurrences(2)) + let results = Array(rule.recurrences(of: start)) + + let expectedResults: [Date] = [ + start, + referenceEnd.addingTimeInterval(nsec) + ] + XCTAssertEqual(results, expectedResults, "Failed for nanoseconds \(nsec)") + } } }