我面临的问题是startDate是2025年1月1日而endDate是2025年3月31日。这 2 个日期之间相隔 90 天。但我的代码计算的是 89 天。
我已经看到代码的数学计算排除了 2025 年 1 月 1 日的第一部分时间(从午夜到 06:00),这导致 89 天而不是 90 天。
开始日期:2025-01-01 06:00:00 +0000
结束日期: 2025-03-31 06:00:00 +0000
这是我的职责:
func daysBetweenDates() -> Int? {
guard let selectedStartDate = selectedStartDate?.date else { return nil }
guard let selectedEndDate = selectedEndDate?.date else { return 0 }
let calendar = Calendar.current
let dateComponents = calendar.dateComponents([.day], from: selectedStartDate, to: selectedEndDate)
return dateComponents.day
}
我尝试过的是将小时数重置为 0,这样就可以花费一整天并返回 90 天。 像这样:
func daysBetweenDates() -> Int? {
guard let selectedStartDate = selectedStartDate?.date else { return nil }
guard let selectedEndDate = selectedEndDate?.date else { return 0 }
var calendar = Calendar(identifier: .gregorian)
calendar.timeZone = TimeZone(secondsFromGMT: 0) ?? .current
let cleanMidNightStartDate = calendar.startOfDay(for: selectedStartDate)
let cleanMidNightEndDate = calendar.startOfDay(for: selectedEndDate.addingTimeInterval(24 * 60 * 60))
let dateComponents = calendar.dateComponents([.day], from: cleanMidNightStartDate, to: cleanMidNightEndDate)
let daysCount = dateComponents.day ?? 0
return daysCount
}
这特别适用于该日期,但是当我尝试更改日期时,例如 开始日期:2024 年 12 月 18 日。 结束日期:2025 年 3 月 18 日, 这些日期之间有 90 天,但该函数现在显示为 91 天。
我正在寻找解决此问题的巧妙解决方案,这样我就可以获得尽可能高质量的代码。
您的代码给出了正确的答案,具体取决于您如何解释最后一天。
考虑从 2025-01-01 06:00 到 2025-01-02 06:00 的小情况 - 一个 24 小时周期已过去,并且给定此输入,您的代码将输出“1”。
对于您问题中的值,2025-01-01 06:00 到 2025-03-31 06:00 89 24 小时周期已经过去,您的代码再次给出了正确的答案。
如果您简单地将月份中的天数相加,您会感到困惑 - 31 + 28 + 31=90。这是不正确的,因为它是从 1 月 1 日午夜算到 3 月 31 日 23:59:59 - 多了 24 小时,这就是为什么你认为答案应该是 90。
如果你拿到一本日历,把手指放在 1 月 1 日,然后数一下下一个日期每次移动的次数,那么到 3 月 31 日时,你会发现你已经移动了 89 次手指。
如果您不关心时间部分并且想要计算整天,只需按照 HangarRash 的建议添加 1 即可。