Swift DateComponentsFormatter отбрасывает начальные нули, но сохраняет хотя бы одну цифру в минутах - PullRequest
0 голосов
/ 12 февраля 2019

Я использую следующий DateComponentsFormatter в Swift:

let formatter = DateComponentsFormatter()
formatter.unitsStyle   = .positional
formatter.allowedUnits = [.hour, .minute, .second]
formatter.zeroFormattingBehavior = [.default]

Это приводит к результатам как 2:41 (для 2 минут и 41 секунда) и 08 (для 8 секунд).Однако я хотел бы сохранить хотя бы одну цифру в месте «Минуты», возвращая 0:08 вместо 08. Возможно ли это с DateComponentsFormatter?Я бы предпочел решение, которое возвращает локализованный результат.

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Да.Это может быть легко достигнуто добавлением троичного условного выражения на основе временного интервала при установке допустимых единиц форматирования компонентов даты:


extension Formatter {
    static let positional: DateComponentsFormatter = {
        let positional = DateComponentsFormatter()
        positional.unitsStyle = .positional
        positional.zeroFormattingBehavior = .pad
        return positional
    }()
}

extension TimeInterval {
    var positionalTime: String {
        Formatter.positional.allowedUnits = self >= 3600 ?
                                            [.hour, .minute, .second] :
                                            [.minute, .second]
        return Formatter.positional.string(from: self)!
    }
}

Использование

8.0.positionalTime     //    "0:08"
161.0.positionalTime   //    "2:41"
3600.0.positionalTime  // "1:00:00"
0 голосов
/ 12 февраля 2019

Проверьте другое значение свойства zeroFormattingBehavior.Я использую это, чтобы получить результат, который, я думаю, вы ищете, но экспериментируйте по мере необходимости ...

    formatter.zeroFormattingBehavior = [.pad]
...