当前,我正在使用这些函数组来过滤应用程序内部使用的日期对象。
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日,则也应该返回该日期对象。目前,除非确实在同一日历周内,否则我什么都不会退回。
答案 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
是两个输入日期之间的签名天数。如果b
在a
之后为正,如果b
在a
之前为负。
我会将其包装在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")
}