我在 iOS 8 上使用 NSDateComponentsFormatter,我注意到 stringFromTimeInterval:
方法的实现中可能存在错误,但我不能确定。
这是我设置格式化程序的方式:
NSDateComponentsFormatter *formatter = [[NSDateComponentsFormatter alloc] init];
formatter.zeroFormattingBehavior = NSDateComponentsFormatterZeroFormattingBehaviorDefault;
formatter.allowedUnits = NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
formatter.unitsStyle = NSDateComponentsFormatterUnitsStylePositional;
现在,当我将小于 60 秒的任何内容传递给 stringFromTimeInterval:
方法时,格式化程序返回 1
或 01
,这显然是错误,它应该返回类似 0:XX
的内容。
我还注意到,通过将 unitsStyle
更改为 NSDateComponentsFormatterUnitsStylePositional
以外的任何内容,该方法会返回正确的字符串!
例子:
unitsStyle = NSDateComponentsFormatterUnitsStylePositional
:
(lldb) po [formatter stringFromTimeInterval:12]
= "1"
=> 应该返回“0:12”!!
unitsStyle = NSDateComponentsFormatterUnitsStyleAbbreviated
:
(lldb) po [formatter stringFromTimeInterval:12]
= "12 s"
=> 正确!
这让我认为这是 Apple 的 API 实现中的错误,还是我遗漏了什么?
最佳答案
这似乎仍然是 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”。
现在您可以根据您有超过 1 小时还是 1 天的时间来使用 allowedUnits
。例如,在一个具有 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
}
}
关于ios - NSDateComponentsFormatter stringFromTimeInterval 为小于 1 分钟的间隔返回不正确的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28087724/