比较目标c中的时间

时间:2013-09-10 07:53:10

标签: objective-c nsdate

我想比较不同时间的出口与ipad当前时间,所以我做的是这个

if(CT!=nil && startTime!=nil &&endTime!=nil)
{

    /* If current time is greater than begin time but less than end time then he can give feedack
     */
    if (([CT compare:startTime]== NSOrderedDescending) && ([CT compare:endTime]== NSOrderedAscending) ) {

        return YES;
    }

    else if (([CT compare:startTime]== NSOrderedSame) || ([CT compare:endTime]== NSOrderedSame))
    {
         return YES;
    }
    else if (([CT compare:startTime]== NSOrderedDescending) && ([CT compare:endTime]== NSOrderedDescending))
    {
        return NO; // out of outlet timings
    }

直到现在这似乎工作得很好,但是当我将出口时间改为

开始时间=下午18:30 结束时间=凌晨2:00

然后在这种情况下,上面的代码失败,当ipad在凌晨1点钟时,然后第一个if条件失败,所以我在下面添加了这段代码

 if (([CT compare:startTime]== NSOrderedAscending) && ([CT compare:endTime]== NSOrderedAscending))
    {


    }

现在作为开发人员,我确信如果设备在凌晨1点计时,那么它不会失败,但如果有人将出口时间更新为

开始时间=上午9:00 结束时间=上午11:00

和当前设备时间=上午8:00

然后在上面的例子中,我的第二个代码将失败。

我想要的是一些建议,就像我在第二个if条件中可以做的那样

创建CT的代码是:

 NSDate *sysDate = [NSDate date];
NSDateFormatter *df = [[NSDateFormatter alloc]init];
[df setDateFormat:@"HH:mm:ss"];
NSString *timeString = [df stringFromDate:sysDate];
NSDate *CT = [df dateFromString:timeString];

startTime和endTime是存储在plist中的日期对象。

3 个答案:

答案 0 :(得分:1)

重写您的条件,好像有数字而不是日期,看看他们实际做了什么(NSOrderedDescending变为>“大于”,NSOrderedAscending变为<“更少比“):

if (ctNumber > startNumber && ctNumber < endNumber)
{ ... }
else if (ctNumber == startNumber || ctNumber == endNumber)
{ ... }
else if (ctNumber > startNumber && ctNumber > endNumber)
{ ... }

我希望通过这种方式很明显最后一个不是你的意思,而你后来尝试的另一个条件仍然不正确。正确的是(ctNumber < startNumber || ctNumber > endNumber),这正是独立的else所做的,所以你可以放弃它:

if (ctNumber > startNumber && ctNumber < endNumber)
{ ... }
else if (ctNumber == startNumber || ctNumber == endNumber)
{ ... }
else 
{ /* otherwise ; everything else ; in all other cases */ ... }

但是你真的应该遵循@ ILYA2606的建议,并在将来比较时间间隔(这是数字),以避免进一步的混淆。它还允许您使用<=>=,因此放弃中间条件:

NSTimeInterval ctNumber = [CT timeIntervalSince1970];
NSTimeInterval startNumber = [startDate timeIntervalSince1970];
NSTimeInterval endNumber = [endDate timeIntervalSince1970];

BOOL ctLiesInsideInterval = (ctNumber >= startNumber && ctNumber <= endNumber);
return ctLiesInsideInterval;

最后,我必须指出创建CT的日期格式化程序代码是无意义的,相当于只使用当前时间:

NSDate* CT = [NSDate date];

答案 1 :(得分:0)

将NSString转换为NSDate,比较timeIntervals:

NSDateFormatter *df = [[NSDateFormatter alloc]init];
    [df setDateFormat:@"HH:mm:ss"];    
NSDate *CTDate = [df dateFromString:CT];
NSDate *startDate = [df dateFromString:startTime];
NSTimeInterval CTInterval = [CTDate timeIntervalSince1970];
NSTimeInterval startInterval = [startDate timeIntervalSince1970];
NSTimeInterval deltaInterval = startInterval - CTInterval;

if(deltaInterval < 0){
    //Ascending (CT < startTime)
}
else if(deltaInterval > 0){
    //Descending (CT > startTime)
}
else{
    //Some (CT = startTime)
}

答案 2 :(得分:0)

试试这个..

 NSDate *currentDate=[NSDate date];  

 NSTimeInterval daysInSeconds = 60*60; 
 NSDate *starttime= [currentDate dateByAddingTimeInterval:daysInSeconds];

 daysInSeconds = 2*60*60;
 NSDate *endtime= [currentDate dateByAddingTimeInterval:daysInSeconds];

 if( [starttime compare:currentDate]==NSOrderedAscending ){
     //Ascending (CT < startTime)
 }

 if( [starttime compare:currentDate]==NSOrderedDescending ){
     //Descending (CT > startTime)
 }

 if( [endtime compare:currentDate]==NSOrderedAscending ){
     //Ascending (CT < endtime)
 }

 if( [endtime compare:currentDate]==NSOrderedDescending ){
     //Descending (CT > endtime)
 }