#objective-c #nsdate
#objective-c #nsdate
Вопрос:
Когда я пытаюсь вычислить время, прошедшее с использованием компонентов даты, дата отключается на одну секунду. Почему это так?
NSCalendar *sysCalendar = [NSCalendar currentCalendar];
unsigned int unitFlags = NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;
NSDateComponents *conversionInfo = [sysCalendar components:unitFlags fromDate:timeStarted toDate:[[NSDate date]addTimeInterval: 1.0] options:0];
timeElapsed = [sysCalendar dateFromComponents:conversionInfo];
Мое временное исправление — добавить одну секунду, но я хочу понять, почему это происходит, или если есть лучшее решение.
РЕДАКТИРОВАТЬ: это не одна секунда, но она округляется в меньшую сторону. Когда я получаю интервал времени в секундах (который сводит его к десятичным разрядам), он оказывается равным 1.9, 2.9, 3.9 и показывает 00:00:01, 00:00:02, 00:00:03 соответственно. Как я могу заставить его округлить?
Комментарии:
1. Вы могли бы добавить 0,5 секунды. Это должно работать во всех случаях. Но это все равно ужасное решение.
Ответ №1:
Вы можете округлить значение double (NSTimeInterval) до целого числа с помощью:
NSTimeInterval unrounded = 7.8;
long rounded = lround(unrounded);
Длинное целое число, «округленное», теперь будет содержать 8. Теперь вы можете вернуть это значение к временному интервалу.
NSTimeInterval roundedTimeInterval = (NSTimeInterval)rounded;
и используйте это с функциями NSDate.
Итак, чтобы создать NSDate только с полными секундами, вы можете использовать:
NSDate *nowEnough = [NSDate dateWithTimeIntervalSinceReferenceDate:(NSTimeInterval)lround([NSDate timeIntervalSinceReferenceDate])];
или для округления подсекунд существующего NSDate:
NSDate *thenEnough = [NSDate dateWithTimeIntervalSinceReferenceDate:(NSTimeInterval)lround([existingNSDatesName timeIntervalSinceReferenceDate])];