У меня есть следующий код, который предназначен для преобразования миллисекунд в часы, минуты и секунды:
int hours = floor(rawtime / 3600000);
int mins = floor((rawtime % 3600000) / (1000 * 60));
int secs = floor(((rawtime % 3600000) % (1000 * 60)) / 1000);
NSLog(@"%d:%d:%d", hours, mins, secs);
NSString *hoursStr = [NSString stringWithFormat:@"%d", hours];
NSString *minsStr = [NSString stringWithFormat:@"%d", mins];
NSString *secsStr = [NSString stringWithFormat:@"%d", secs];
NSLog(@"%a:%a:%a", hoursStr, minsStr, secsStr);
Довольно простой. Rawtime является интервалом со значением 1200. Вывод похож на это:
0:0:1
0x1.3eaf003d9573p-962:0x1.7bd2003d3ebp-981:-0x1.26197p-698
Почему случается так, что преобразование ints к строкам дает такие дикие числа? Я попытался использовать %i и %u, и они не имели никакого значения.Что происходит?
Вы должны использовать % @
в качестве спецификатора преобразования для NSString. Измените последнюю строку на:
NSLog(@"%@:%@:%@", hoursStr, minsStr, secsStr);
% a
означает нечто совершенно иное. Из справочной страницы printf ()
:
aA
Аргумент double округляется и преобразуется в шестнадцатеричное представление в стиле[-] 0xh.hhhp [+ -] d
где количество цифр после символа шестнадцатеричной точки равно заданной точности.
Вместо использования собственного кода форматирования строки следует использовать NSNumberFormatter
для чисел или NSDateFormatter
для дат / времени. Эти средства форматирования данных заботятся о локализации формата для локали пользователя и обрабатывают множество встроенных форматов.
Для вашего использования вам необходимо преобразовать миллисекундное время в NSTimeInterval
( typedef
'd из двойного):
NSTimeInterval time = rawtime/1e3;
Теперь вы можете использовать NSDateFormatter
для представления времени:
NSDate *timeDate = [NSDate dateWithTimeIntervalSinceReferenceDate:time];
NSString *formattedTime = [NSDateFormatter localizedStringFromDate:timeDate
dateStyle:NSDateFormatterNoStyle
timeStyle:NSDateFormatterMediumStyle];
NSString *rawTime = [[formattedTime componentsSeparatedByString:@" "] objectAtIndex:0];
в OS X, где последняя строка удаляет «AM / PM». Это будет работать в любое время менее 12 часов и даст отформатированную строку в локализованном формате для ЧЧ: ММ: СС. На iPhone localizedStringFromDate: dateStyle: timeStyle:
недоступен (пока). Вы можете добиться того же эффекта с помощью setTimeStyle:
, setDateStyle:
и stringFromDate:
в экземпляре средства форматирования даты.