Строка длительности времени DateComponentsFormatter показывает начальный ноль (например, "01" минут), если повторно использовать форматтер
Я использую DateComponentsFormatter
чтобы получить String
отображать TimeInterval
, В данном конкретном случае я хочу показать только минуты и часы (если час или больше).
Но если я использую тот же экземпляр DateComponentsFormatter
(пытаясь предотвратить повторную повторную инициализацию, используя отложенную переменную) и сначала вызывайте метод с длительностью, большей или равной часу, во второй раз, если он вызывается со значением менее 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 секундами.