0

我想将不同时间的网点与 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 PM 结束时间 = 2:00 AM

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

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


    }

现在作为开发人员,我确信如果设备在凌晨 1:00 计时,那么它不会失败,但是如果有人将插座计时更新为

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

和当前设备时间 = 8:00 AM

那么在上述情况下,我的第二个代码将失败。

我想要的是一些建议,例如在第二个 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 中的日期对象。

4

3 回答 3

1

重写你的条件,就好像有数字而不是日期,看看它们实际上做了什么(NSOrderedDescending变成>“大于”,NSOrderedAscending变成<“小于”):

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

我希望这样很明显最后一个根本不是你的意思,你后来尝试的另一个条件仍然不正确。正确的是(ctNumber < startNumber || ctNumber > endNumber)这正是standaloneelse会做的,所以你可以放弃它:

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

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

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];
于 2013-09-10T10:01:19.783 回答
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)
}
于 2013-09-10T08:18:15.170 回答
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)
 }
于 2013-09-10T09:17:58.173 回答