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

Я читаю книгу о 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;  

3 ответа

NSDate *now = [NSDate date];

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

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

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

NSDate *yesterday = [NSDate dateWithTimeInterval:-86400 sinceDate:now];

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

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

Другие вопросы по тегам