Comparing certain components of NSDate?

前端 未结 4 452
青春惊慌失措
青春惊慌失措 2021-01-05 21:35

How would I compare only the year-month-day components of 2 NSDates?

相关标签:
4条回答
  • 2021-01-05 22:07

    Since iOS 8 you can use -compareDate:toDate:toUnitGranularity: method of NSCalendar.

    Like this:

        NSComparisonResult comparison = [[NSCalendar currentCalendar] compareDate:date1 toDate:date2 toUnitGranularity:NSCalendarUnitDay];
    
    0 讨论(0)
  • 2021-01-05 22:11

    So here's how you'd do it:

    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSInteger desiredComponents = (NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit);
    
    NSDate *firstDate = ...; // one date
    NSDate *secondDate = ...; // the other date
    
    NSDateComponents *firstComponents = [calendar components:desiredComponents fromDate:firstDate];
    NSDateComponents *secondComponents = [calendar components:desiredComponents fromDate:secondDate];
    
    NSDate *truncatedFirst = [calendar dateFromComponents:firstComponents];
    NSDate *truncatedSecond = [calendar dateFromComponents:secondComponents];
    
    NSComparisonResult result = [truncatedFirst compare:truncatedSecond];
    if (result == NSOrderedAscending) {
      //firstDate is before secondDate
    } else if (result == NSOrderedDescending) {
      //firstDate is after secondDate
    }  else {
      //firstDate is the same day/month/year as secondDate
    }
    

    Basically, we take the two dates, chop off their hours-minutes-seconds bits, and the turn them back into dates. We then compare those dates (which no longer have a time component; only a date component) and see how they compare to eachother.

    WARNING: typed in a browser and not compiled. Caveat implementor

    0 讨论(0)
  • 2021-01-05 22:16

    With the the -[NSDate compare:] method - NSDate Compare Reference

    0 讨论(0)
  • 2021-01-05 22:23

    Check out this topic NSDate get year/month/day

    Once you pull out the day/month/year, you can compare them as integers.

    If you don't like that method

    Instead, you could try this..

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    
    [dateFormatter setDateFormat:@"yyyy"];
    int year = [[dateFormatter stringFromDate:[NSDate date]] intValue];
    
    [dateFormatter setDateFormat:@"MM"];
    int month = [[dateFormatter stringFromDate:[NSDate date]] intValue];
    
    [dateFormatter setDateFormat:@"dd"];
    int day = [[dateFormatter stringFromDate:[NSDate date]] intValue];
    
    • And another way...

      NSDateComponents *dateComp = [calendar components:unitFlags fromDate:date];
      
      NSInteger year = [dateComp year];
      
      NSInteger month = [dateComp month];
      
      NSInteger day = [dateComp day];
      
    0 讨论(0)
提交回复
热议问题