倒数计时器实现的两个date之间的区别

(2013-04-04T19:14:58 + 02:00-2013-04-03T18:14:58 + 02:00)怎么可能是两个date之间的差异?

代码的结果是

01日06时46分02秒

结果是完全错误的正确答案应该是

01天01时00分00秒

你能帮我找出问题的根源吗?

代码 :

-(void)startTimer { timer = [NSTimer scheduledTimerWithTimeInterval: 1.0 target:self selector:@selector(updateCountdown) userInfo:nil repeats: YES]; } -(void) updateCountdown { NSDate *expirydate = [MSharedFunctions SqldateStringTodate:@"2013-04-04T19:14:58+02:00"]; NSDate *now = [MSharedFunctions SqldateStringTodate:@"2013-04-03T18:14:58+02:00"]; if ([expirydate isEarlierThanDate:[MSharedFunctions SqldateStringTodate:[MSharedFunctions SqldateStringTodateNow]]]) { //Fire end counter //[[NSNotificationCenter defaultCenter] postNotificationName:@"TIMER" object:nil]; } //NSDate *dateFromString = [[NSDate alloc] init]; NSDate *dateFromString =expirydate; //NSLog(@"now %@: endtime :%@ ",[MSharedFunctions SqldateStringTodateNow],@"2013-04-03T18:14:58+02:00"); NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSDateComponents *componentsHours = [calendar components:NSHourCalendarUnit fromDate:now]; NSDateComponents *componentMint = [calendar components:NSMinuteCalendarUnit fromDate:now]; NSDateComponents *componentSec = [calendar components:NSSecondCalendarUnit fromDate:now]; NSDateComponents *componentsDaysDiff = [calendar components:NSDayCalendarUnit fromDate:now toDate:dateFromString options:0]; NSLog(@"%@",[NSString stringWithFormat:@"%02d",componentsDaysDiff.day]); NSLog(@"%@",[NSString stringWithFormat:@"%02d",(24-componentsHours.hour)]); NSLog(@"%@",[NSString stringWithFormat:@"%02d",(60-componentMint.minute)]); NSLog(@"%@",[NSString stringWithFormat:@"%02d",(60-componentSec.second)]); } 

SqldateStringTodate函数:

 +(NSDate*)SqldateStringTodate:(NSString*) stringdate { stringdate = [stringdate stringByReplacingOccurrencesOfString:@":" withString:@"" options:0 range:NSMakeRange([stringdate length] - 5,5)]; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init] ; NSLocale* formatterLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_GB"] ; [dateFormatter setLocale:formatterLocale]; if (stringdate.length==24) { [dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZ"]; } else { [dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSSZ"]; } //DebugLog(@"New Date %@",stringdate); NSDate *getDate = [dateFormatter dateFromString:stringdate]; return getDate; } 

我无法理解你的逻辑,但是如果你想以你想要的方式作为NSDateComponents获得差异,你可以使用:

 NSUInteger unitFlags = NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit; NSDateComponents *componentsDaysDiff = [calendar components:unitFlags fromDate:now toDate:dateFromString options:0]; NSLog("%@", componentsDayDiff); 

这个收益结果:

 <NSDateComponents: 0x75939f0> Leap month: no Day: 1 Hour: 1 Minute: 0 Second: 0 

那么…又是怎么回事?

为了得到两个NSDate对象之间的区别,使用timeIntervalSinceDate: 然后,要计算之间的天,小时,分钟和秒,使用模分割。

 NSTimeInterval doubleDiff = [date1 timeIntervalSinceDate:date2]; long diff = (long) doubleDiff; int seconds = diff % 60; diff = diff / 60; int minutes = diff % 60; diff = diff / 60; int hours = diff % 24; int days = diff / 24; 

您可以将NSTimeInterval(double)转换为长时间不同的方式,具体取决于您是向上舍入还是向下舍入。