Подтвердить что ты не робот

Что я делаю неправильно с 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).

4b9b3361

Ответ 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