Прошедшие дни между двумя датами

Я читаю книгу об Objective-C и работаю над упражнением по добавлению категории в класс NSDate под названием elapsedDays, которая возвращает количество прошедших дней между датами буксировки. Вот моя попытка:

-(unsigned long) elapsedDays: (NSDate *) theDate{

return ([self timeIntervalSinceDate:theDate]/3600)/24;

}

Вот основной раздел программы, в котором я тестирую свой код:

NSDate *now = [NSDate date];

NSDate *yesterday = [NSDate dateWithTimeIntervalSinceNow:-(3600*24)];


NSLog(@"%@",now);
NSLog(@"%@",yesterday);

NSLog(@"%lu",([now elapsedDays:yesterday]));

Проблема в том, что я получаю ноль результата:

2012-09-22 19:28:24 +0000
2012-09-21 19:28:24 +0000
0

Я понял, что деление [self timeIntervalSinceDate:theDate]/3600 дает 23.99972222222222. и это странно, потому что он должен дать нам 24, поскольку разница между двумя датами составляет всего один день, что составляет 24 часа. Я хочу понять, почему этот код дает мне неправильное количество секунд между двумя датами.

Я исправил это округлением результата деления, но все же хочу понять, что не так.

return round ([self timeIntervalSinceDate:theDate] / 3600) / 24;  

person Aladin    schedule 22.09.2012    source источник


Ответы (3)


NSDate *now = [NSDate date];

NSDate *yesterday = [NSDate dateWithTimeIntervalSinceNow:-(3600*24)];

Выше два оператора будут выполняться один за другим. Из-за этого вы получаете разницу в 1 секунду за 24 часа.

person Yashavant Anuse    schedule 22.09.2012
comment
но, как вы можете видеть в выводе, он показывает: 2012-09-22 19:28:24 +0000 2012-09-21 19:28:24 +0000 - person Aladin; 23.09.2012

Думаю, ответ Яшаванта, наверное, правильный. Регистрируемые строки могут казаться равными, но базовые объекты даты могут отличаться на миллисекунды. Попробуйте сделать это вчера и посмотрите, решит ли это вашу проблему:

NSDate *yesterday = [NSDate dateWithTimeInterval:-86400 sinceDate:now];
person dairystatedesigns    schedule 15.10.2012

Не делайте собственных расчетов даты; пусть NSCalendar сделает их за вас. См. -components:fromDate:toDate:options: среди других полезных методов.

Также полезно узнать о внутренних ограничениях арифметики с плавающей запятой. Например, см. Что должен знать каждый компьютерный ученый о плавающей запятой Арифметика.

person Jon Reid    schedule 23.09.2012