我在NSDateComponentsFormatter上使用allowFractionalUnits做错了什么?

时间:2015-09-11 11:57:10

标签: ios objective-c swift foundation nsdatecomponentsformatter

基本上我想要的是获取仅以小时为单位表示的时间间隔的值,而不是将其四舍五入到整个小时(使用NSDateComponentsFormatter来正确格式化和本地化)。我不知道我是否误解了NSDateComponentsFormatter.allowsFractionalUnits的用法,但我无法让格式化程序给我一个十进制值。任何人都可以帮助我发现我的错误或告诉我我以何种方式误解了这个?

关于allowFractionalUnits属性的Apple文档:

  

当值不能精确时,可以使用小数单位   用可用单位表示。例如,如果分钟不是   允许,值“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)。

3 个答案:

答案 0 :(得分:5)

根据Open Radar #32024200

  

在做了一些挖掘(反汇编基础)后,看起来每次调用 - [NSDateComponentsFormatter _stringFromDateComponents:]中的 - [unitFormatter stringFromNumber:]都会传递+ [NSNumber numberWithInteger:],这会丢弃浮点数据。

你没有做错任何事。国旗被打破了。

答案 1 :(得分:3)

documentation,它使用了很多有趣的语言(强调我的):

  

当无法使用可用单位精确表示值时,可以使用小数单位 。例如,如果不允许分钟,则值“1h 30m” 可以格式化为“1.5h”。

虽然对我来说,似乎只有文档中的值才是实际有效的值才有意义,当然可能存在一些时间值,格式化程序选项和日历/区域设置的组合这项工作。绝对值得在功能和文档上提交Radar。

答案 2 :(得分:-5)

在这里输入代码据我所知,你想在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