Это связано с ошибками округления (обратите внимание, что Date
внутренне представляется как число с плавающей запятой, содержащее количество секунд с 1 января 2001 года). Если вы получите больше компонентов разности
let difference = calendar.dateComponents([.day, .hour, .minute, .second, .nanosecond],
from: date, to: someFutureDate)
, то вы заметите, что в первом примере это что-то вроде
day: 6656 hour: 23 minute: 59 second: 59 nanosecond: 999999755
, что почти ожидается 6657 дней. Похоже, что возможно исправить эту проблему, удалив «дробную часть» даты с
let date = calendar.date(bySetting: .nanosecond, value: 0, of: Date())!
или
let date = Date(timeIntervalSinceReferenceDate:
Date().timeIntervalSinceReferenceDate.rounded())
С этим изменением я больше не смогу наблюдать разницу.