是另一个日期的同一周,月,年的日期

Anc*_*inu 21 date ios swift

知道某个日期是在同一周(或年份或月份)中的最佳方式是什么,最好是使用扩展,并且只使用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)

请不要提出解决桥接DateNSDate

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)