Прошедшие дни между двумя датами
Я читаю книгу о 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:
среди других полезных методов.
Также полезно изучить внутренние ограничения арифметики с плавающей точкой. Например, посмотрите, что должен знать каждый компьютерщик об арифметике с плавающей точкой.