计算天数之间的差异时,结果不正确

ARC*_*ARC 1 cocoa cocoa-touch objective-c

我使用以下代码片段来查找两个日期之间的差异,结果是关闭一天:

NSString * dateString = @"2011-11-26" ;
NSDateFormatter * dateFormatter = [[NSDateFormatter alloc]init];  
[dateFormatter setDateFormat:@"yyyy-MM-dd"];  
NSDate * today = [[NSDate alloc] init];
NSDate * futureDate = [dateFormatter dateFromString:dateString];;
NSCalendar * gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSUInteger unitFlags =  NSDayCalendarUnit;
NSDateComponents * components = [gregorian components:unitFlags fromDate:today toDate:futureDate options:0];
NSLog(@"Number of days: %i",[components day]);
[today release];
[dateFormatter release];
Run Code Online (Sandbox Code Playgroud)

天数:6以上代码.实际上距离2011年11月19日是7天.

在此输入图像描述

更新:以下工作正常.我在重复代码吗?

            NSString * dateString = @"2011-11-26" ;
            NSDateFormatter * dateFormatter = [[[NSDateFormatter alloc] init] autorelease];  
            [dateFormatter setDateFormat:@"yyyy-MM-dd"];  
            NSDate * today = [NSDate date];

            NSCalendar * greg = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
            NSUInteger uf = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;
            NSDateComponents * comp = [greg components:uf fromDate:today];
            today = [greg dateFromComponents:comp];

            NSDate * futureDate = [dateFormatter dateFromString:dateString];;
            NSCalendar * gregorian = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
            NSUInteger unitFlags =  NSDayCalendarUnit;
            NSDateComponents * components = [gregorian components:unitFlags fromDate:today toDate:futureDate options:0];

           NSLog(@"Number of days: %ld",[components day]);
Run Code Online (Sandbox Code Playgroud)

Jes*_*sak 7

Apple的文档components:fromDate:toDate:说这个:

如果没有足够小的单位要求保持差异的全部精度,则结果是有损的.

这意味着它想告诉你的区别是"6天12小时31分2秒......"但你只问了几天,所以你回来了6.我的建议是今天回合首先是日期到午夜,所以它是距离目标日期的整数天.

编辑:您可以通过要求NSCalendar为您NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit提供今天的日期,然后从这些组件重新构建日期来进行此舍入.(分别使用components:fromDate:dateFromComponents:.)