在同一个星期,同一个月份,同一个date的date很快

什么是最好的方法来知道一个date是在同一周(或一年或一个月)作为另一个,最好有一个扩展名,并完全使用Swift

作为一个例子,在Objective-C中我有

- (BOOL)isSameWeekAs:(NSDate *)date { NSDateComponents *otherDay = [[NSCalendar currentCalendar] components:NSCalendarUnitEra | NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay fromDate:self]; NSDateComponents *today = [[NSCalendar currentCalendar] components:NSCalendarUnitEra | NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay fromDate:date]; return ([today weekOfYear] == [otherDay weekOfYear] && [today year] == [otherDay year] && [today era] == [otherDay era]); } 

请不要提出解决scheme桥接DateNSDate

您可以使用日历方法isDate(equalTo:granularity:)来检查它如下:

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

您可以使用基于您提供的Objective-C代码的扩展名:

 extension Date { func hasSame(_ components: Calendar.Component..., as date: Date, using calendar: Calendar = .autoupdatingCurrent) -> Bool { return components.filter { calendar.component($0, from: date) != calendar.component($0, from: self) }.isEmpty } } 

这里的默认日历是autoupdatingCurrent所以如果用户更改日历,它将相应地更新。 它还使用可变参数组件,允许您指定任意数量的组件,而不将其包装到数组中。

使用示例:

 let date1 = Date() let date2 = Date() let date3 = Date(timeIntervalSince1970: 30.0) print(date1.hasSame(.weekOfYear, .day, .hour, as: date2)) // true print(date1.hasSame(.weekOfYear, as: date3)) // false 

编辑

正如@Leo Dabus指出的,我们可以在这里使用set而不是array / variadic参数 – 这样,如果用户将一些重复项传递给方法,我们将避免多次比较相同的组件:

 extension Date { func hasSame(_ components: Set<Calendar.Component>, as date: Date, using calendar: Calendar = .autoupdatingCurrent) -> Bool { return components.filter { calendar.component($0, from: date) != calendar.component($0, from: self) }.isEmpty } }