如果重新使用格式化程序

时间:2017-03-03 17:21:32

标签: ios swift date-formatting nsdatecomponents nsdatecomponentsformatter

我使用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秒再调用它,就会发生这种情况。

0 个答案:

没有答案