Конвертировать минуты в ЧЧ: ММ: СС - Свифт - PullRequest
0 голосов
/ 14 февраля 2020

У меня есть несколько текстовых полей в массиве. НН: ММ: СС. У меня две проблемы, одна из которых - когда одно из полей оставлено пустым, приложение вылетает, и я хочу, чтобы оно просто читалось как «0», если оно пустое. Во-вторых, я использую ниже, чтобы преобразовать ЧЧ: ММ: СС в минуты. Я делаю 0:18:30, и математика, приведенная ниже к десятичной дроби, получается 18,5

Теперь, как мне преобразовать это обратно в ЧЧ: ММ: СС? array[0] - часы, array[1] - минуты, array[2] - секунды.

stepOne = (Float(array[0])! * 60) + Float(array[1])! + (Float(array[2])! / 60)

1 Ответ

1 голос
/ 14 февраля 2020

Вам нужно рассчитать количество секунд вместо количества минут. Используя метод Reduce, просто умножьте первый элемент на 3600, а затем разделите множитель на 60 после каждой итерации. Затем вы можете использовать DateComponentsFormatter для отображения результирующего интервала времени в секундах, используя стиль .positional единиц для пользователя:

let array = [0,18,30]
var n = 3600
let seconds = array.reduce(0) {
    defer { n /= 60 }
    return $0 + $1 * n
}

let dcf = DateComponentsFormatter()
dcf.allowedUnits = [.hour, .minute, .second]
dcf.unitsStyle = .positional
dcf.zeroFormattingBehavior = .pad
let string = dcf.string(from: TimeInterval(seconds))  // "00:18:30"
...