Comparing NSDates without time component

后端 未结 17 1678
轮回少年
轮回少年 2020-11-27 12:49

In a swift playground, I have been using

NSDate.date() 

But, this always appears with the time element appended. For my app I need to ignor

17条回答
  •  挽巷
    挽巷 (楼主)
    2020-11-27 13:21

    You can compare two dates using it's description.

    let date1 = NSDate()
    let date2 = NSDate(timeIntervalSinceNow: 120)
    if date1.description == date2.description {
        print(true)
    } else {
        print(false)   // false (I have added 2 seconds between them)
    }
    

    If you want set the time element of your dates to a different time you can do as follow:

    extension NSDate {
        struct Calendar {
            static let gregorian = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!
        }
        var day:    Int { return Calendar.gregorian.component(.Day,    fromDate: self)   }
        var month:  Int { return Calendar.gregorian.component(.Month,  fromDate: self)  }
        var year:   Int { return Calendar.gregorian.component(.Year,   fromDate: self)  }
    
        var noon: NSDate {
            return Calendar.gregorian.dateWithEra(1, year: year, month: month, day: day, hour: 12, minute: 0, second: 0, nanosecond: 0)!
        }
    }
    
    let date1 = NSDate()
    let date2 = NSDate(timeIntervalSinceNow: 120)
    print(date1.noon == date2.noon)   // true
    

    or you can also do it using NSDateFormatter:

    extension NSDate {
        struct Date {
            static let formatterYYYYMMDD: NSDateFormatter = {
                let formatter = NSDateFormatter()
                formatter.dateFormat = "yyyyMMdd"
                return formatter
            }()
        }
        var yearMonthDay: String {
            return Date.formatterYYYYMMDD.stringFromDate(self)
        }
        func isSameDayAs(date:NSDate) -> Bool {
            return yearMonthDay == date.yearMonthDay
        }
    }
    
    let date1 = NSDate()
    let date2 = NSDate(timeIntervalSinceNow: 120)
    print(date1.yearMonthDay == date2.yearMonthDay)   // true
    
    print(date1.isSameDayAs(date2))    // true
    

    Another option (iOS8+) is to use calendar method isDate(inSameDayAsDate:):

    extension NSDate {
        struct Calendar {
            static let gregorian = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!
        }
        func isInSameDayAs(date date: NSDate) -> Bool {
            return Calendar.gregorian.isDate(self, inSameDayAsDate: date)
        }
    }
    let date1 = NSDate()
    let date2 = NSDate(timeIntervalSinceNow: 120)
    if date1.isInSameDayAs(date: date2 ){
        print(true)   // true
    } else {
        print(false)
    }
    

提交回复
热议问题