测量日期之间天数的最佳方法

问题描述 投票:0回答:1

我面临的问题是startDate2025年1月1日endDate2025年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 天。

我正在寻找解决此问题的巧妙解决方案,这样我就可以获得尽可能高质量的代码。

swift
1个回答
0
投票

您的代码给出了正确的答案,具体取决于您如何解释最后一天。

考虑从 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 即可。

© www.soinside.com 2019 - 2024. All rights reserved.