NSDate Выключено на 1 секунду

#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])];