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

时间:2011-11-19 16:28:01

标签: objective-c cocoa-touch cocoa

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

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];

天数:以上代码为6。实际上距离2011年11月19日还有7天。

enter image description here

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

            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]);

1 个答案:

答案 0 :(得分:7)

Apple关于components:fromDate:toDate:的文档说:

  

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

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

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