日付が別の週と同じ週(または年または月)にあるかどうか、できれば拡張子を付けて、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]);
}
Date
をNSDate
にブリッジするソリューションを提案しないでください。
提供した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
}
}