确保返回日期在当前日期的 7 天内

Make sure returned dates are within seven days of current date

目前我正在使用这组函数来过滤在我的应用程序中使用的日期对象。

func isInSameWeek(date: Date) -> Bool {
    return Calendar.current.isDate(self, equalTo: date, toGranularity: .weekOfYear)
}
func isInSameMonth(date: Date) -> Bool {
    return Calendar.current.isDate(self, equalTo: date, toGranularity: .month)
}
func isInSameYear(date: Date) -> Bool {
    return Calendar.current.isDate(self, equalTo: date, toGranularity: .year)
}
func isInSameDay(date: Date) -> Bool {
    return Calendar.current.isDate(self, equalTo: date, toGranularity: .day)
}
var isInThisWeek: Bool {
    return isInSameWeek(date: Date())
}
var isInToday: Bool {
    return Calendar.current.isDateInToday(self)
}
var isInTheFuture: Bool {
    return Date() < self
}
var isInThePast: Bool {
    return self < Date()
}

它们工作正常,但唯一的问题是我想 return 为当天 7 天内的对象约会。因此,如果日期对象发生在 2 月 11 日,那么它也应该被 returned。目前我不会 return 任何东西,除非它确实在同一个日历周内。

这是一个使用 Calendar

nextDate(after:matching:matchingPolicy:) API 获取结束日期的解决方案
extension Date {
    func isInSevenDays() -> Bool {
        let now = Date()
        let calendar = Calendar.current
        let weekday = calendar.dateComponents([.weekday], from: now)
        let startDate = calendar.startOfDay(for: now)
        let nextWeekday = calendar.nextDate(after: now, matching: weekday, matchingPolicy: .nextTime)!
        let endDate = calendar.date(byAdding: .day, value: 1, to: nextWeekday)!
        return self >= startDate && self < endDate
    }
}

我假设您只想考虑每个 Date 的日历日期部分,而忽略一天中的时间。因此,您会认为 2019-02-01-12:00:00 在 2019-02-08-14:00:00 的 7 天内,即使这两个时刻之间有 7 天零 2 小时,也就是更多刚好超过 7 天。

您可以使用两种 Calendar 方法来计算两个 Date 之间的日历日差异,忽略一天中的时间。首先,获取每个 Date 的年月日分量,丢弃时间部分:

    let aymd = calendar.dateComponents([.year, .month, .day], from: a)
    let bymd = calendar.dateComponents([.year, .month, .day], from: b)

然后向Calendar询问两者之间天数的差异DateComponents:

    let diff = dateComponents([.day], from: aymd, to: bymd).day!

这个diff是两个输入日期之间有符号的天数。如果 ba 之后,则为正,如果 ba 之前,则为负。

我会像这样在 Calendar 的扩展中总结它:

extension Calendar {

    func roundedDays(from a: Date, to b: Date) -> Int {
        let aymd = dateComponents([.year, .month, .day], from: a)
        let bymd = dateComponents([.year, .month, .day], from: b)
        let diff = dateComponents([.day], from: aymd, to: bymd).day!
        return diff
    }

}

那么你可以这样使用它:

let calendar = Calendar.autoupdatingCurrent

if abs(calendar.roundedDays(from: Date(), to: targetDate)) <= 7 {
    print("\(targetDate) is within 7 days of now")
}