NSDate在两个给定的NSDate之间

Hay*_*ene 7 cocoa nsdate

我有兴趣创建一种方法来查找当前日期是否在任何给定日期的特定时间之间.这是一个调度程序,所以我想找到当前发生的事件.每天都有相同的时间:820-900,900-940,940-1020等.由于这必须在任何一天完成,我不知道如何在一定时间内创建NSDate.我想这可能是用NSTimeInterval完成的,但我不确定如何实例化它.

con*_*gan 26

这不是完美的,但您可以使用[NSDate compare:]来检查两个边界的日期:

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;
}
Run Code Online (Sandbox Code Playgroud)

或者更简单地说:

BOOL between = NO;

if (([myDate compare:firstDate] == NSOrderedDescending) &&
    ([myDate compare:secondDate] == NSOrderedAscending)) {

    between = YES;
}
Run Code Online (Sandbox Code Playgroud)

我确信有更好的方法来进行复杂的日期比较,但这应该有效.


bbu*_*bum 11

最简单的方法是使用-timeIntervalSinceReferenceDate将每个日期转换为NSTimeInterval类型值,这实际上只是一个double.

NSTimeInterval rightNow = [[NSDate date] timeIntervalSinceReferenceDate];
Run Code Online (Sandbox Code Playgroud)

从那里,确定日期是否在任何给定的两个日期之间只是简单的数字比较的问题.

如果需要将日期的字符串表示形式转换为NSDate实例,然后检索时间间隔,请使用NSDateFormatter.

如果需要从已知日期组件创建日期,请使用NSCalendar.(即,您知道年份是2010年,月份是4,日期是12,您可以使用NSCalendar的组件通过该-dateFromComponents:方法生成NSDate实例.).

正如Ben指出的那样,NSCalendar的组件接口也可用于计算小时和分钟,以确定它是否在一个范围内(这似乎是非典型用法,因为大多数事件不会同时发生.但是......确定......也有理由这样做!)