How to determine if an NSDate is today?

前端 未结 20 1912
礼貌的吻别
礼貌的吻别 2020-11-28 18:20

How to check if an NSDate belongs to today?

I used to check it using first 10 characters from [aDate description]. [[aDate descriptio

相关标签:
20条回答
  • 2020-11-28 18:58

    This is an offshoot to your question, but if you want to print an NSDate with "Today" or "Yesterday", use the function

    - (void)setDoesRelativeDateFormatting:(BOOL)b
    

    for NSDateFormatter

    0 讨论(0)
  • 2020-11-28 19:00

    Swift version of the best answer:

    let cal = NSCalendar.currentCalendar()
    var components = cal.components([.Era, .Year, .Month, .Day], fromDate:NSDate())
    let today = cal.dateFromComponents(components)!
    
    components = cal.components([.Era, .Year, .Month, .Day], fromDate:aDate);
    let otherDate = cal.dateFromComponents(components)!
    
    if(today.isEqualToDate(otherDate)) {
        //do stuff
    }
    
    0 讨论(0)
  • 2020-11-28 19:02

    The correct and safe solution without force-unwrapping, working on Swift 2.2 and before iOS 8:

    func isToday() -> Bool {
        let calendar = NSCalendar.currentCalendar()
        if #available(iOS 8.0, *) {
            return calendar.isDateInToday(self)
        }
    
        let todayComponents = calendar.components([.Era, .Year, .Month, .Day], fromDate:NSDate())
        let dayComponents = calendar.components([.Era, .Year, .Month, .Day], fromDate:self)
    
        guard let today = calendar.dateFromComponents(todayComponents),
            day = calendar.dateFromComponents(dayComponents) else {
            return false
        }
    
        return today.compare(day) == .OrderedSame
    }
    
    0 讨论(0)
  • 2020-11-28 19:04

    You can compare date components:

    NSDateComponents *otherDay = [[NSCalendar currentCalendar] components:NSCalendarUnitEra | NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay fromDate:aDate];
    NSDateComponents *today = [[NSCalendar currentCalendar] components:NSCalendarUnitEra | NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay fromDate:[NSDate date]];
    if([today day] == [otherDay day] &&
       [today month] == [otherDay month] &&
       [today year] == [otherDay year] &&
       [today era] == [otherDay era]) {
        //do stuff
    }
    

    Edit:

    I like stefan's method more, I think it makes for a cleaner and more understandable if statement:

    NSCalendar *cal = [NSCalendar currentCalendar];
    NSDateComponents *components = [cal components:(NSCalendarUnitEra | NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay) fromDate:[NSDate date]];
    NSDate *today = [cal dateFromComponents:components];
    components = [cal components:(NSCalendarUnitEra | NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay) fromDate:aDate];
    NSDate *otherDate = [cal dateFromComponents:components];
    
    if([today isEqualToDate:otherDate]) {
        //do stuff
    }
    

    Chris, I've incorporated your suggestion. I had to look up what era was, so for anyone else who doesn't know, it distinguishes between BC and AD. This is probably unnecessary for most people, but it's easy to check and adds some certainty, so I've included it. If you're going for speed, this probably isn't a good method anyway.


    NOTE as with many answers on SO, after 7 years this is totally out of date. In Swift now just use .isDateInToday

    0 讨论(0)
  • 2020-11-28 19:04

    Refer to Apple's documentation entry entitled "Performing Calendar Calculations" [link].

    Listing 13 on that page suggests that to determine the number of midnights between days, you use:

    - (NSInteger)midnightsFromDate:(NSDate *)startDate toDate:(NSDate *)endDate
    {
        NSCalendar *calendar = [NSCalendar autoupdatingCurrentCalendar];
        NSInteger startDay = [calendar ordinalityOfUnit:NSDayCalendarUnit
                                                 inUnit:NSEraCalendarUnit
                                                forDate:startDate];
        NSInteger endDay = [calendar ordinalityOfUnit:NSDayCalendarUnit
                                               inUnit:NSEraCalendarUnit
                                              forDate:endDate];
        return endDay - startDay;
    }
    

    You may then determine if two days are the same by using that method and seeing if it returns 0 or not.

    0 讨论(0)
  • 2020-11-28 19:05
    extension NSDate {
      func isToday() -> Bool {
        let cal = NSCalendar.currentCalendar()
        var components = cal.components([.Era, .Year, .Month, .Day], fromDate:NSDate())
        let today = cal.dateFromComponents(components)!
    
        components = cal.components([.Era, .Year, .Month, .Day], fromDate:self)
        let otherDate = cal.dateFromComponents(components)!
    
        return today.isEqualToDate(otherDate)
    }
    

    Worked for me on Swift 2.0

    0 讨论(0)
提交回复
热议问题