ios - NSDateComponentsFormatter stringFromTimeInterval 为小于 1 分钟的间隔返回不正确的字符串

标签 ios objective-c cocoa-touch nsdate nsdatecomponents

我在 iOS 8 上使用 NSDateComponentsFormatter,我注意到 stringFromTimeInterval: 方法的实现中可能存在错误,但我不能确定。

这是我设置格式化程序的方式:

NSDateComponentsFormatter *formatter = [[NSDateComponentsFormatter alloc] init];
formatter.zeroFormattingBehavior = NSDateComponentsFormatterZeroFormattingBehaviorDefault;
formatter.allowedUnits = NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
formatter.unitsStyle = NSDateComponentsFormatterUnitsStylePositional;

现在,当我将小于 60 秒的任何内容传递给 stringFromTimeInterval: 方法时,格式化程序返回 101,这显然是错误,它应该返回类似 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/

相关文章:

ios - iOS AVSpeechSynthesizer 是否支持嵌入式语音命令

ios - ActionSheet 源 View BarButtonItem

ios - 在 UIButton 中添加图像作为附件

cocoa-touch - 如何使 UITableViewCell 上的 UIProgressView 立即更改?

ios - iOS应用程式当机-[NSURL initFileURLWithPath :]

iOS - 无法在具有比例变换的 UIViewAnimation 期间点击 UIView

iphone - 没有要编译的体系结构(ARCHS=arm6 arm7,VALID_ARCHS=armv7)

objective-c - 为什么我的目标没有打印到控制台?

ios - 如何从旋转木马中拖动 View

ios - UITableViewCell 自定义 subview