知道一个日期是否与另一个日期在同一周(或年或月),最好是延期,还是solely using 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的解决方案

推荐答案

您可以使用日历方法isDate(equalTo:granularity:)进行如下判断:

Xcode 11 • Swift 5.1

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(as date: Date) -> Bool { isEqual(to: date, toGranularity: .year) }
    func isInSameMonth(as date: Date) -> Bool { isEqual(to: date, toGranularity: .month) }
    func isInSameWeek(as date: Date) -> Bool { isEqual(to: date, toGranularity: .weekOfYear) }

    func isInSameDay(as date: Date) -> Bool { Calendar.current.isDate(self, inSameDayAs: date) }

    var isInThisYear:  Bool { isInSameYear(as: Date()) }
    var isInThisMonth: Bool { isInSameMonth(as: Date()) }
    var isInThisWeek:  Bool { isInSameWeek(as: 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() }
}

Swift相关问答推荐

VisionOS发送通知

阴影动画的动画不流畅

SwiftUI:使视图B与视图A具有相同宽度的视图A更改比率?

SWIFT Vapor控制台应用程序-操作无法完成.权限被拒绝

NSApplication是否需要NSApplicationDelegate?

Swift数据关系

使用UICollectionViewFlowLayout创建水平的UICollectionView,并同时将单元格对齐到左边和右边的能力

如何在类中打印函数

在 Swift 中增量写入大型文本文件的最佳方法

为什么 NumberFormatter 在 Swift 中将 19,999,999,999,999,999 格式化为 20,000,000,000,000,000?

这是 Int64 Swift Decoding 多余的吗?

为什么 performSegue() 不调用 shouldPerformSegue()

SwiftUI:当先前的视图列表更改时,NavigationView 详细视图会弹出回栈

如何将回调传递给 View init

从 Finder 打开文件时,SwiftUI 的应用程序(_ openFile:) 从未调用过

使用 Date.ParseStrategy 将字符串解析为日期

如何使被拖动的对象成为前景(foreground)对象

Swift:在子类中覆盖 == 导致仅在超类中调用 ==

如何实现 Swift 的 Comparable 协议?

如何在 Swift 中将 NSURL 转换为字符串