我使用DateComponentsFormatter
获取String
来显示TimeInterval
。在这种特殊情况下,我想只显示分钟和小时(如果一小时或更长时间)。
但是如果我使用相同的DateComponentsFormatter
实例(尝试防止重复重新初始化,使用延迟var)并且首先调用持续时间大于或等于一小时的方法,那么第二次它被调用的值小于10分钟,它始终具有前导零。
class DurationStringHelper {
private lazy var timeFormatter: DateComponentsFormatter = {
let formatter = DateComponentsFormatter()
formatter.zeroFormattingBehavior = .dropLeading
formatter.allowedUnits = [.hour, .minute]
return formatter
}()
public func duration(seconds: TimeInterval) -> String {
return timeFormatter.string(from: seconds)!
}
}
// CASE 1:
let c1 = DurationStringHelper()
c1.duration(seconds: 3600) // "1:00"
c1.duration(seconds: 60) // "01" ARGH WHY GOD WHY!!!
// CASE 2: (first call less than an hour)
let c2 = DurationStringHelper()
c2.duration(seconds: 3599) // "59"
c2.duration(seconds: 60) // "1"
我目前的方法是检查是否存在不需要的前导零(检查字符的存在并检查秒是否落入某个范围)并将其删除。这是一个丑陋的黑客。
这对我来说似乎是一个错误,所以我向Apple提交了一份报告。不明白为什么一个格式化程序的调用会影响以后的调用。
注意:如果您在允许的单位中包含.day
,并且首先以一天或更长时间间隔调用它,然后再少于10小时,则似乎不会发生同样的事情。虽然如果将allowedUnits
设置为[.minute, .second]
,然后先用60秒然后用9秒再调用它,就会发生这种情况。