iOS: Compare two NSDate-s without time portion

前端 未结 5 1768
谎友^
谎友^ 2020-12-02 17:22

I want to compare two dates: date1 and date2

2011-06-06 12:59:48.994 Project[419:707] firstDate:2011-06-06 10:59:21 +0000
2011-06-06 12:59:49.004 Project[419         


        
相关标签:
5条回答
  • 2020-12-02 17:42
    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSInteger comps = (NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear);
    
    NSDateComponents *date1Components = [calendar components:comps 
                                                    fromDate: date1];
    NSDateComponents *date2Components = [calendar components:comps 
                                                    fromDate: date2];
    
    date1 = [calendar dateFromComponents:date1Components];
    date2 = [calendar dateFromComponents:date2Components];
    
    NSComparisonResult result = [date1 compare:date2];
    if (result == NSOrderedAscending) {
    } else if (result == NSOrderedDescending) {
    }  else {
        //the same
    }
    

    There is another handy method to create for a given date the date that represents the start of a given unit: [aCalendar rangeOfUnit:startDate:interval:forDate:]
    To illustrate how this method works, see this code, that easily creates the date for the beginning of the day, week, month and year for a given date (here: now).

    NSDate *now = [NSDate date];
    NSDate *startOfToday = nil;
    NSDate *startOfThisWeek = nil;
    NSDate *startOfThisMonth = nil;
    NSDate *startOfThisYear = nil;
    [[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit startDate:&startOfToday interval:NULL forDate:now];
    [[NSCalendar currentCalendar] rangeOfUnit:NSWeekCalendarUnit startDate:&startOfThisWeek interval:NULL forDate:now];
    [[NSCalendar currentCalendar] rangeOfUnit:NSMonthCalendarUnit startDate:&startOfThisMonth interval:NULL forDate:now];
    [[NSCalendar currentCalendar] rangeOfUnit:NSYearCalendarUnit startDate:&startOfThisYear interval:NULL forDate:now];
    
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateStyle:NSDateFormatterFullStyle];
    [formatter setTimeStyle:NSDateFormatterFullStyle];
    
    NSLog(@"%@", [formatter stringFromDate:now]);
    NSLog(@"%@", [formatter stringFromDate:startOfToday]);
    NSLog(@"%@", [formatter stringFromDate:startOfThisWeek]);
    NSLog(@"%@", [formatter stringFromDate:startOfThisMonth]);
    NSLog(@"%@", [formatter stringFromDate:startOfThisYear]);
    

    result:

    Thursday, July 12, 2012, 4:36:07 PM Central European Summer Time 
    Thursday, July 12, 2012, 12:00:00 AM Central European Summer Time 
    Sunday, July 8, 2012, 12:00:00 AM Central European Summer Time 
    Sunday, July 1, 2012, 12:00:00 AM Central European Summer Time 
    Sunday, January 1, 2012, 12:00:00 AM Central European Standard Time
    

    this allows us to shorten the first code to:

    [[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit startDate:&date1 interval:NULL forDate:date1];
    [[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit startDate:&date2 interval:NULL forDate:date2];
    
    NSComparisonResult result = [date1 compare:date2];
    if (result == NSOrderedAscending) {
    } else if (result == NSOrderedDescending) {
    }  else {
        //the same
    }
    

    Note, that in this code, date1 and date2 will be overwritten. Alternatively you can pass in a reference to another NSDate pointer for startDate as shown in the code above, where now stays untouched.

    0 讨论(0)
  • 2020-12-02 17:48

    I have used another method with NSDateFormatter and a string comparison, less smarter than NSDate compare method but faster to write and flexible enough to do variety of comparison :

    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setDateFormat:@"yyyy-MM-dd"];
    
    if ([[dateFormat stringFromDate:date1] isEqualToString:[dateFormat stringFromDate:date2]])
    {
        //It's the same day
    }
    
    0 讨论(0)
  • 2020-12-02 17:49

    Swift Version , Comparing Dates and ignoring their time.

    let dateExam1:NSDate = NSDate.init(timeIntervalSinceNow: 300)
    let dateExam2:NSDate = NSDate.init(timeIntervalSinceNow: 10000)
    
    let currCalendar = NSCalendar.currentCalendar()
    
    let dateCompanent1:NSDateComponents = currCalendar.components([.Year,.Month,.Day], fromDate: dateExam1)
    let dateCompanent2:NSDateComponents = currCalendar.components([.Year,.Month,.Day], fromDate: dateExam2)
    
    let date1WithoutTime:NSDate? = currCalendar .dateFromComponents(dateCompanent1)
    let date2WithoutTime:NSDate? = currCalendar .dateFromComponents(dateCompanent2)
    if (date1WithoutTime != nil) && (date2WithoutTime != nil)
    {
        let dateCompResult:NSComparisonResult = date1WithoutTime!.compare(date2WithoutTime!)
        if (dateCompResult == NSComparisonResult.OrderedSame)
        {
            print("Same Dates")
        }
        else
        {
            print("Different Dates")
        }
    }
    
    0 讨论(0)
  • 2020-12-02 17:54

    Okay, so it's a few years after the original question was asked, but it's probably worth mentioning that NSCalendar now has a number of methods that make certain date comparison questions much more straight-forward:

    NSCalendar *currentCalendar = [NSCalendar currentCalendar];
    Bool sameDay = [currentCalendar isDate:dateA inSameDayAsDate:dateB];
    
    0 讨论(0)
  • 2020-12-02 18:00

    Updating @LuAndre answer swift 5

        let dateExam1 = Date(timeIntervalSinceNow: 300)
        let dateExam2 = Date(timeIntervalSinceNow: 10000)
    
        let currCalendar = Calendar.current
    
        let dateCompanent1 = currCalendar.dateComponents([.year,.month,.day], from: dateExam1)
        let dateCompanent2 = currCalendar.dateComponents([.year,.month,.day], from: dateExam2)
    
    
        if  let date1WithoutTime = currCalendar.date(from:dateCompanent1), let dateCompanent2 = currCalendar.date(from:dateCompanent2) {
                let dateCompResult = date1WithoutTime.compare(dateCompanent2)
                if (dateCompResult == ComparisonResult.orderedSame)
                {
                    print("Same Dates")
                }
                else
                {
                    print("Different Dates")
                }
            
        }
    
    0 讨论(0)
提交回复
热议问题