我想比较不同时间的出口与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中的日期对象。
答案 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)
}