Строка длительности времени 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 секундами.

0 ответов

Другие вопросы по тегам