определять
func secondsToHoursMinutesSeconds (seconds : Int) -> (Int, Int, Int) {
return (seconds / 3600, (seconds % 3600) / 60, (seconds % 3600) % 60)
}
использование
> secondsToHoursMinutesSeconds(27005)
(7,30,5)
или
let (h,m,s) = secondsToHoursMinutesSeconds(27005)
Вышеупомянутая функция использует кортежи Swift для одновременного возврата трех значений. Вы деструктурируете кортеж, используяlet (var, ...)
синтаксис, или можете получить доступ к отдельным членам кортежа, если это необходимо.
Если вам действительно нужно распечатать его со словами и Hours
т. Д., Используйте что-то вроде этого:
func printSecondsToHoursMinutesSeconds (seconds:Int) -> () {
let (h, m, s) = secondsToHoursMinutesSeconds (seconds)
print ("\(h) Hours, \(m) Minutes, \(s) Seconds")
}
Обратите внимание, что приведенная выше реализация secondsToHoursMinutesSeconds()
работает для Int
аргументов. Если вам нужна Double
версия, вам нужно решить, какие возвращаемые значения могут быть (Int, Int, Double)
или могут быть (Double, Double, Double)
. Вы можете попробовать что-то вроде:
func secondsToHoursMinutesSeconds (seconds : Double) -> (Double, Double, Double) {
let (hr, minf) = modf (seconds / 3600)
let (min, secf) = modf (60 * minf)
return (hr, min, 60 * secf)
}
(seconds % 3600) % 60
можно оптимизировать доseconds % 60
. Не нужно сначала извлекать часы.printSecondstoHoursMinutesSeconds()
ничего не возвращает (см.-> ()
тип возвращаемого значения в объявлении функции). Функция что-то печатает; который не отображается на игровой площадке. Если вы хотите, чтобы он что-то возвращал, скажите a,String
затем устранитеprintln()
вызов и исправьте тип возвращаемого значения функции.Int
тип из - за характер из/
и%
функций. То есть/
выпадает фракционная часть. Тот же код не будет работатьDouble
. В частности, 2 == 13/5, но 2,6 == 13,0 / 5. Поэтому вам понадобится другая реализация дляDouble
. Я обновил свой ответ примечанием по этому поводу.В macOS 10.10+ / iOS 8.0+
(NS)DateComponentsFormatter
было введено создание читаемой строки.Он учитывает локаль и язык пользователя.
Доступные стили унифицированные
positional
,abbreviated
,short
,full
,spellOut
иbrief
.Для получения дополнительной информации прочтите документацию .
источник
formatter.unitsStyle = .positional
дает именно то, что я хочу (то есть7:30:05
)! Лучший ответ IMOhours * 3600 + minutes * 60
Основываясь на ответе Вадиана , я написал расширение, которое принимает
Double
(вTimeInterval
том числе псевдоним типа) и выводит строку, отформатированную как время.Вот как
DateComponentsFormatter.UnitsStyle
выглядят различные варианты:источник
Doubles
в Swift.formatter.zeroFormattingBehavior = .pad
. Это даст нам:3660.asString(style: .positional) // 01:01:00
Я создал гибрид из существующих ответов, чтобы все упростить и уменьшить объем кода, необходимого для Swift 3 .
Использование:
Печать:
00:01:40
источник
Вот более структурированный / гибкий подход: (Swift 3)
Такой подход позволяет добавить такой удобный синтаксический анализ:
Следует отметить, что подходы, основанные исключительно на целых числах, не принимают во внимание високосные дни / секунды. Если вариант использования имеет дело с реальными датами / временем, следует использовать дату и календарь .
источник
month
к своей реализации? Заранее спасибо!return number < 10 ? "0\(number)" : "\(number)"
, используя средство форматирования строк,return String(format: "%02d", number)
которое автоматически добавляет ноль, когда число меньше 10В Swift 5:
Для вызова функции
Вернусь 02:44:57
источник
Swift 4
источник
Вот еще одна простая реализация в Swift3.
источник
Решение SWIFT 3.0, основанное примерно на описанном выше, с использованием расширений.
Использовать его с AVPlayer, называя это так?
источник
Я ответил на аналогичный вопрос , но вам не нужно отображать миллисекунды в результате. Следовательно, для моего решения требуется iOS 10.0, tvOS 10.0, watchOS 3.0 или macOS 10.12.
Звонить следует
func convertDurationUnitValueToOtherUnits(durationValue:durationUnit:smallestUnitDuration:)
из ответа, который я уже упоминал здесь:источник
Swift 5:
Использование:
источник
Согласно ответу GoZoner, я написал расширение, чтобы время было отформатировано в соответствии с часами, минутами и секундами:
источник
Вот что я использую для своего музыкального проигрывателя в Swift 4+. Я конвертирую секунды Int в читаемый формат String
Используйте так:
Вывод:
2:11:43
источник
Ответ @ r3dm4n был отличным. Однако мне понадобился еще час. На всякий случай, если кому-то тоже понадобится, вот оно:
источник
Последний код: XCode 10.4 Swift 5
источник
Swift 5 и String Response, в презентабельном формате
Использование:
источник
Самый простой способ имхо:
источник
ld
double вместоd
int.NSTimeInterval
этоDouble
делать делать это с расширением. Пример:источник
Я пошел дальше и создал закрытие для этого (в Swift 3).
Это даст m = 4 и s = 59. Так что вы можете отформатировать это как хотите. Вы, конечно, можете добавить часы, если не больше информации.
источник
Swift 4 Я использую это расширение
Useage
источник
ответ Ника неверен .
вот правильная версия
источник
Другой способ - преобразовать секунды в дату и взять компоненты, то есть секунды, минуты и час, из самой даты. Это решение имеет ограничение только до 23:59:59
источник