Неверные результаты при расчете разницы между количеством дней - PullRequest
1 голос
/ 19 ноября 2011

Я использую следующий фрагмент кода, чтобы найти разницу между двумя датами, и результат выключен на один день:

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 из приведенного выше кода.На самом деле это 7 дней с сегодняшнего дня 19 ноября 2011 года.

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 Ответ

7 голосов
/ 19 ноября 2011

Документы Apple о components:fromDate:toDate: говорят так:

Результат с потерями, если недостаточно запрошенного юнита для сохранения полной точности разности.

Это означает, что он хотел бы сказать вам, что разница составляет «6 дней и 12 часов и 31 минута и 2 секунды ...», но вы спрашивали только дни, поэтому вы вернетесь 6. Мое предложение будет сначала округлить сегодняшнюю дату до полуночи, чтобы получить целое число дней от целевой даты.

Редактировать: вы можете выполнить это округление, попросив NSCalendar дать вам NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit сегодняшней даты, а затем пересоздать дату из этих компонентов. (Используя components:fromDate: и dateFromComponents: соответственно.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...