知道某个日期是在同一周(或年份或月份)中的最佳方式是什么,最好是使用扩展,并且只使用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]);
}
Run Code Online (Sandbox Code Playgroud)
请不要提出解决桥接Date
至NSDate
Leo*_*bus 80
您可以使用日历方法isDate(equalTo:granularity:)
进行检查,如下所示:
extension Date {
func isEqual(to date: Date, toGranularity component: Calendar.Component, in calendar: Calendar = .current) -> Bool {
calendar.isDate(self, equalTo: date, toGranularity: component)
}
func isInSameYear (date: Date) -> Bool { isEqual(to: date, toGranularity: .year) }
func isInSameMonth(date: Date) -> Bool { isEqual(to: date, toGranularity: .month) }
func isInSameDay (date: Date) -> Bool { isEqual(to: date, toGranularity: .day) }
func isInSameWeek (date: Date) -> Bool { isEqual(to: date, toGranularity: .weekOfYear) }
var isInThisYear: Bool { isInSameYear(date: Date()) }
var isInThisMonth: Bool { isInSameMonth(date: Date()) }
var isInThisWeek: Bool { isInSameWeek(date: Date()) }
var isInYesterday: Bool { Calendar.current.isDateInYesterday(self) }
var isInToday: Bool { Calendar.current.isDateInToday(self) }
var isInTomorrow: Bool { Calendar.current.isDateInTomorrow(self) }
var isInTheFuture: Bool { self > Date() }
var isInThePast: Bool { self < Date() }
}
Run Code Online (Sandbox Code Playgroud)
Mr.*_*hog 10
您可以使用此扩展程序,该扩展程序基于您提供的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
}
}
Run Code Online (Sandbox Code Playgroud)
这里的默认日历是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
Run Code Online (Sandbox Code Playgroud)
编辑
正如@Leo Dabus指出的那样,我们可以使用set here而不是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
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
8434 次 |
最近记录: |