确保返回日期在当前日期的 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
是两个输入日期之间有符号的天数。如果 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")
}
目前我正在使用这组函数来过滤在我的应用程序中使用的日期对象。
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
是两个输入日期之间有符号的天数。如果 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")
}