计算日期之间的天数 Swift(考虑明天可能发生的事情。)

Count Days between Dates Swift (Considering what may be tomorrow.)

我有这个代码:

extension Date {
    /// From today to self
    /// - Returns: number of days.
    func getDaysUntil() -> Int? {        
        return Calendar.current.dateComponents([.day], from: Date(), to: self).day
    }
}

我需要根据 EST 考虑一切。所以无论我们在哪个时区,都应视为美国东部标准时间。

我在比较今天和明天时遇到了问题。

所以考虑以下情况:

Date() //(现在)::6 月 15 日。 自己(比较)::6 月 16 日。

不管今天是什么时候,我想说距离比较日期(自己)还有1天。

所以,如果它是 11:59pm 并且比较日期(自身)是 12:01am,我希望结果是 1 天。如果是12:01am,比较日期(self)是11:59pm,我还是希望比较结果是1.

实际上,无论我做什么,当我们到达那些极端边缘时,无论哪种方式,日期计算都会偏离 1。

此外,这 不仅仅是 今天与明天的问题。正确的计数应该是任何日期的结果(考虑 today/tomorrow 难题)。

是否有什么花哨的技巧,或者有人对我们如何实现这一目标有任何建议吗?谢谢!

如果您需要默认的“无关”时间日历计算,您需要使用中午时间。检查 WWDC 会话 227 Solutions to Common Date and Time Challenges。检查“午夜”部分,以及为什么人们不应该使用午夜。

extension Calendar {
    static let iso8601 = Calendar(identifier: .iso8601)
}

extension Date {
    /// From today's noon to self's noon
    /// - Returns: number of days.
    var daysFromToday: Int {
        Calendar.iso8601.dateComponents([.day], from: Date().noon, to: noon).day!
    }
    /// Noon time
    /// - Returns: same date at noon
    var noon: Date {
        Calendar.iso8601.date(bySettingHour: 12, minute: 0, second: 0, of: self)!
    }
}

用法:

let yesterday = DateComponents(calendar: .iso8601, year: 2022, month: 5, day: 2, hour: 23, minute: 59, second: 59).date!

yesterday.daysFromToday  // -1