我在iOS 8上使用NSDateComponentsFormatter并且我注意到stringFromTimeInterval:
方法的实现可能存在错误,但我无法肯定地说出来。
这就是我设置格式化程序的方法:
NSDateComponentsFormatter *formatter = [[NSDateComponentsFormatter alloc] init];
formatter.zeroFormattingBehavior = NSDateComponentsFormatterZeroFormattingBehaviorDefault;
formatter.allowedUnits = NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
formatter.unitsStyle = NSDateComponentsFormatterUnitsStylePositional;
现在,当我向stringFromTimeInterval:
方法传递少于60秒的任何内容时,格式化程序返回1
或01
,这显然是错误的,它应该返回类似{{1}的内容}}
我还注意到,通过将0:XX
更改为unitsStyle
以外的任何内容,该方法会返回正确的字符串!
示例:
使用NSDateComponentsFormatterUnitsStylePositional
:
unitsStyle = NSDateComponentsFormatterUnitsStylePositional
=>应该返回" 0:12" !!
使用(lldb) po [formatter stringFromTimeInterval:12]
= "1"
:
unitsStyle = NSDateComponentsFormatterUnitsStyleAbbreviated
=>正确!
这让我觉得这是Apple实施API的一个错误,还是我错过了什么?
答案 0 :(得分:9)
这似乎仍然是iOS 8.3和Xcode 6.3的问题。 有一种方法可以解决它,但是,如果不是完美的话,至少可以让你获得正确的格式,而不必自己处理拆分相关组件的时间。
以下是Swift中的示例解决方法(您可以在Playground中测试)
let formatter = NSDateComponentsFormatter()
formatter.unitsStyle = .Positional
formatter.zeroFormattingBehavior = .Pad
formatter.allowedUnits = .CalendarUnitMinute | .CalendarUnitSecond
致电let string = formatter.stringFromTimeInterval(4)
将打印" 00:04"。
致电let string = formatter.stringFromTimeInterval(88)
将打印" 01:28"。
现在,您可以使用allowedUnits
,具体取决于您是否有超过1小时或1天。例如,在具有formatter
属性的类中:
func updateTimeFormatterForTime(time: NSTimeInterval) {
if time > 3600 && time < 24 * 3600 {
self.formatter.allowedUnits = .CalendarUnitHour | .CalendarUnitMinute | .CalendarUnitSecond
} else if time > 24 * 3600 {
self.formatter.allowedUnits = .CalendarUnitDay | .CalendarUnitHour | .CalendarUnitMinute | .CalendarUnitSecond
}
}
答案 1 :(得分:2)
NSDateComponentsFormatterZeroFormattingBehaviorDefault表示删除前导零,为位置单位样式填充其他零。
e.g。使用代码中的allowedUnits值,[formatter stringFromTimeInterval:120]结果为“2:00”而不是“0d 0:02:00”, 因为formatter对象删除了所有前导零值。
如果要保留零值位置,可以使用NSDateComponentsFormatterZeroFormattingBehaviorNone
为什么[formatter stringFromTimeInterval:12]结果为1,我认为格式化程序对象单独发现“12”是不明确的,因为它没有例如“1d”中的结尾值或指示符。
答案 2 :(得分:0)
这个功能怎么样:
func stringFromTimeInterval(interval: NSTimeInterval) -> String {
let ti: Int = Int(interval)
let seconds: Int = ti % 60
let minutes: Int = (ti / 60) % 60
let hours: Int = (ti / 3600)
var time: String? = nil
if hours > 0 {
time = String(format: "%02i:%02i:%02i", hours, minutes, seconds)
}
else {
time = String(format: "%02i:%02i", minutes, seconds)
}
return time!
}
以此格式化字符串返回时间:59:04(mm:ss)或09:01:34(hh:mm:ss)