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

时间:2019-02-05 03:26:38

标签: ios swift date dateformatter

当前,我正在使用这些函数组来过滤应用程序内部使用的日期对象。

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()
}

它们工作正常,但是唯一的问题是我想返回当天7天之内的日期对象。因此,如果日期对象发生在2月11日,则也应该返回该日期对象。目前,除非确实在同一日历周内,否则我什么都不会退回。

2 个答案:

答案 0 :(得分:1)

这是一个通过nextDate(after:matching:matchingPolicy:)的{​​{1}} API获取结束日期的解决方案

Calendar

答案 1 :(得分:1)

我假设您只想考虑每个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")
}