web-dev-qa-db-ja.com

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]);
}

DateNSDateにブリッジするソリューションを提案しないでください。

18
AncAinu

提供した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を使用することができます-そのようにして、ユーザーがメソッドに重複を渡す場合に同じコンポーネントを何度も比較することを避けます:

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
    }
}
9
Mr. Hedgehog