There are 4 methods for comparing dates:
isEqualToDate(anotherDate: NSDate) -> Bool
earlierDate(anotherDate: NSDate) -> NSDate
laterDate(anotherDate: NSDate) -> NSDate
compare(anotherDate: NSDate) -> NSComparisonResult
- (BOOL)isEqualToDate:(NSDate *)anotherDate
- (NSDate *)earlierDate:(NSDate *)anotherDate
- (NSDate *)laterDate:(NSDate *)anotherDate
- (NSComparisonResult)compare:(NSDate *)anotherDate
Let's say we have 2 dates:
let date1: NSDate = ... // initialized as July 7, 2016 00:00:00 let date2: NSDate = ... // initialized as July 2, 2016 00:00:00
NSDate *date1 = ... // initialized as July 7, 2016 00:00:00 NSDate *date2 = ... // initialized as July 2, 2016 00:00:00
Then, to compare them, we try this code:
if date1.isEqualToDate(date2) { // returns false, as both dates aren't equal } earlierDate: NSDate = date1.earlierDate(date2) // returns the earlier date of the two (date 2) laterDate: NSDate = date1.laterDate(date2) // returns the later date of the two (date1) result: NSComparisonResult = date1.compare(date2) if result == .OrderedAscending { // true if date1 is earlier than date2 } else if result == .OrderedSame { // true if the dates are the same } else if result == .OrderedDescending { // true if date1 is later than date1 }
if ([date1 isEqualToDate:date2]) { // returns false, as both date are not equal } NSDate *earlierDate = [date1 earlierDate:date2]; // returns date which comes earlier from both date, here it will return date2 NSDate *laterDate = [date1 laterDate:date2]; // returns date which comes later from both date, here it will return date1 NSComparisonResult result = [date1 compare:date2]; if (result == NSOrderedAscending) { // fails // comes here if date1 is earlier then date2, in our case it will not come here } else if (result == NSOrderedSame){ // fails // comes here if date1 is same as date2, in our case it will not come here } else{ // NSOrderedDescending // succeeds // comes here if date1 is later than date2, in our case it will come here }
If you want to compare dates and handle seconds, weeks, months and years:
let dateStringUTC = "2016-10-22 12:37:48 +0000" let dateFormatter = DateFormatter() dateFormatter.locale = Locale(identifier: "en_US_POSIX") dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss X" let date = dateFormatter.date(from: dateStringUTC)! let now = Date() let formatter = DateComponentsFormatter() formatter.unitsStyle = .full formatter.maximumUnitCount = 2 let string = formatter.string(from: date, to: Date())! + " " + NSLocalizedString("ago", comment: "added after elapsed time to say how long before")
Or you can use this for each component:
// get the current date and time let currentDateTime = Date() // get the user's calendar let userCalendar = Calendar.current // choose which date and time components are needed let requestedComponents: Set<Calendar.Component> = [ .year, .month, .day, .hour, .minute, .second ] // get the components let dateTimeComponents = userCalendar.dateComponents(requestedComponents, from: currentDateTime) // now the components are available dateTimeComponents.year dateTimeComponents.month dateTimeComponents.day dateTimeComponents.hour dateTimeComponents.minute dateTimeComponents.second