NSDate between two given NSDates

前端 未结 3 1278
暖寄归人
暖寄归人 2020-12-03 15:57

I am interested in creating a method to find if the current date falls between certain times on any given day. It is for a scheduling program, so I want to find what event i

相关标签:
3条回答
  • 2020-12-03 16:17

    The easiest way to do this would be to use -timeIntervalSinceReferenceDate to turn each of your dates into an NSTimeInterval typed value, which is really just a double.

    NSTimeInterval rightNow = [[NSDate date] timeIntervalSinceReferenceDate];
    

    From there, determining if a date is in between any given two dates is just a matter of simple numeric comparisons.

    If you need to convert from a string representation of a date to an NSDate instance to then retrieve a time interval, use NSDateFormatter.

    If you need to create a date from known date components, use NSCalendar. (i.e. you know the year is 2010, the month is 4 and the day is 12, you can use NSCalendar's components to generate an NSDate instance via the -dateFromComponents: method.).

    As Ben indicated, NSCalendar's component interface can also be used to suss out the hour & minute to determine if it is in a range (which would seemingly be an atypical usage in that most events don't happen every day at the same time... but... sure... there are reasons to do that, too!)

    0 讨论(0)
  • 2020-12-03 16:27

    This isn't perfect, but you could use [NSDate compare:] to check your date against both boundaries:

    NSDate *firstDate = ...
    NSDate *secondDate = ...
    
    NSDate *myDate = [NSDate date];
    
    switch ([myDate compare:firstDate]) {
        case NSOrderedAscending:
            NSLog(@"myDate is older");
            // do something
            break;
        case NSOrderedSame:
            NSLog(@"myDate is the same as firstDate");
            // do something
            break;
        case NSOrderedDescending:
            NSLog(@"myDate is more recent");
            // do something
            break;
    }
    
    switch ([myDate compare:secondDate]) {
        case NSOrderedAscending:
            NSLog(@"myDate is older");
            // do something
            break;
        case NSOrderedSame:
            NSLog(@"myDate is the same as secondDate");
            // do something
            break;
        case NSOrderedDescending:
            NSLog(@"myDate is more recent");
            // do something
            break;
    }
    

    Or more briefly:

    BOOL between = NO;
    
    if (([myDate compare:firstDate] == NSOrderedDescending) &&
        ([myDate compare:secondDate] == NSOrderedAscending)) {
    
        between = YES;
    }
    

    I'm sure there's a better way to do complex date comparison, but this should work.

    0 讨论(0)
  • 2020-12-03 16:31

    Take a look at -[NSCalendar components:fromDate:]. It will let you 'decompose' a date into its various components, and then you can, in this instance, look at the hour and minute.

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