Comparing NSDates without time component

后端 未结 17 1611
轮回少年
轮回少年 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

    For iOS7 support

    let dateFormatter = NSDateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd"
    let date1String = dateFormatter.stringFromDate(date1)
    let date2String = dateFormatter.stringFromDate(date2)
    if date1String == date2String {
        println("Equal date")
    }
    
    0 讨论(0)
  • 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)
    }
    
    0 讨论(0)
  • 2020-11-27 13:22

    I wrote a Swift 4 extension for comparing two dates:

    import Foundation
    
    extension Date {      
      func isSameDate(_ comparisonDate: Date) -> Bool {
        let order = Calendar.current.compare(self, to: comparisonDate, toGranularity: .day)
        return order == .orderedSame
      }
    
      func isBeforeDate(_ comparisonDate: Date) -> Bool {
        let order = Calendar.current.compare(self, to: comparisonDate, toGranularity: .day)
        return order == .orderedAscending
      }
    
      func isAfterDate(_ comparisonDate: Date) -> Bool {
        let order = Calendar.current.compare(self, to: comparisonDate, toGranularity: .day)
        return order == .orderedDescending
      }
    }
    

    Usage:

    startDate.isSameDateAs(endDate) // returns a true or false

    0 讨论(0)
  • 2020-11-27 13:22

    Swift iOS 8 and up When you need more than simply bigger or smaller date comparisons. For example is it the same day or the previous day,...

    extension Date {
        func compareTo(date: Date, toGranularity: Calendar.Component ) -> ComparisonResult  {
            var cal = Calendar.current
            cal.timeZone = TimeZone(identifier: "Europe/Paris")!
            return cal.compare(self, to: date, toGranularity: toGranularity)
            }
        }
    

    For examples how to use this in a filter see this answer:

    https://stackoverflow.com/a/45746206/4946476

    0 讨论(0)
  • 2020-11-27 13:22

    Swift 4

    func compareDate(date1:Date, date2:Date) -> Bool {
        let order = Calendar.current.compare(date1, to: date2,toGranularity: .day)
        switch order {
        case .orderedSame:
            return true
        default:
            return false
        }
    }
    
    0 讨论(0)
提交回复
热议问题