Что я делаю неправильно с allowFractionalUnits на NSDateComponentsFormatter?
В принципе, я хочу получить значение интервала времени, представленного только в часах, без округления до полного часа (используя NSDateComponentsFormatter, чтобы получить его правильно форматированный и локализованный). Я не знаю, неправильно ли я понял использование NSDateComponentsFormatter.allowsFractionalUnits, но я не могу заставить форматировать дать мне десятичное значение. Может ли кто-нибудь помочь мне определить мою ошибку или сказать мне, каким образом я неправильно понимаю это?
Из документов Apple о разрешении свойстваFractionalUnits:
Дробные единицы могут использоваться, когда значение не может быть точно представленный с использованием доступных единиц. Например, если минуты не разрешено, значение "1h 30m" может быть отформатировано как "1.5h".
Пример кода Swift:
let formatter = NSDateComponentsFormatter()
formatter.unitsStyle = .Abbreviated
formatter.allowedUnits = .Hour
formatter.allowsFractionalUnits = true
let onePointFiveHoursInSeconds = NSTimeInterval(1.5 * 60.0 * 60.0)
print(formatter.stringFromTimeInterval(onePointFiveHoursInSeconds)!)
//"1h" instead of expected "1.5h"
Тот же пример в коде Objective-C:
NSDateComponentsFormatter *formatter = [[NSDateComponentsFormatter alloc] init];
formatter.unitsStyle = NSDateComponentsFormatterUnitsStyleAbbreviated;
formatter.allowedUnits = NSCalendarUnitHour;
formatter.allowsFractionalUnits = YES;
NSTimeInterval onePointFiveHoursInSeconds = 1.5 * 60.0 * 60.0;
NSLog(@"%@", [formatter stringFromTimeInterval:onePointFiveHoursInSeconds]);
//"1h" instead of expected "1.5h"
Обновление:
Я сообщил об ошибке Apple об этой проблеме (rdar://22660145).
Ответы
Ответ 1
По данным открытого радара № 32024200:
После некоторого копания (дизассемблирования Foundation), похоже, что каждый вызов - [_ _ unitFormatter stringFromNumber:] in - [NSDateComponentsFormatter _stringFromDateComponents:] передается + [NSNumber numberWithInteger:], который отбрасывает данные с плавающей запятой.
Вы не делаете ничего плохого. Флаг просто сломан.
Ответ 2
Глядя на documentation, он использует много интересного языка (внимание мое):
Дробные единицы могут использоваться, когда значение не может быть точно представлено с использованием доступных единиц. Например, если минуты не разрешены, значение "1h 30m" может отформатировать как "1.5h".
В то время как мне кажется, что смысл в документах будет иметь значение, которое действительно работает, возможно, что существует некоторая комбинация значений времени, параметров форматирования и настроек календаря/локали, которые могли бы сделать эта работа. Определенно стоит подавать радар как на функциональность, так и на документацию.
Ответ 3
Проще всего (я только что указал минуты как один из разрешенных единиц для вашего форматирования):
let formatter = NSDateComponentsFormatter()
formatter.unitsStyle = .Abbreviated
formatter.allowedUnits = [.Hour, .Minute] // specify minutes so that fractions of hours (minutes, in fact) don't get truncated
formatter.allowsFractionalUnits = true
let onePointFiveHoursInSeconds = NSTimeInterval(1.5 * 60.0 * 60.0)
print(formatter.stringFromTimeInterval(onePointFiveHoursInSeconds)!)
Ответ 4
введите код здесь Насколько я понял, вы хотите отобразить время в 12-часовой форме? Правильно?
Ниже приведен код:
Swift →
let dateAsString = "20:30"
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "HH:mm"
let date = dateFormatter.dateFromString(dateAsString)
dateFormatter.dateFormat = "h:mm a"
let date12 = dateFormatter.stringFromDate(date!)
txtText.text = date12