Definir
func secondsToHoursMinutesSeconds (seconds : Int) -> (Int, Int, Int) {
return (seconds / 3600, (seconds % 3600) / 60, (seconds % 3600) % 60)
}
Usar
> secondsToHoursMinutesSeconds(27005)
(7,30,5)
ou
let (h,m,s) = secondsToHoursMinutesSeconds(27005)
A função acima utiliza as tuplas Swift para retornar três valores ao mesmo tempo. Você desestrutura a tupla usando a let (var, ...)
sintaxe ou pode acessar membros individuais, se necessário.
Se você realmente precisar imprimi-lo com as palavras, Hours
etc, use algo como isto:
func printSecondsToHoursMinutesSeconds (seconds:Int) -> () {
let (h, m, s) = secondsToHoursMinutesSeconds (seconds)
print ("\(h) Hours, \(m) Minutes, \(s) Seconds")
}
Observe que a implementação acima secondsToHoursMinutesSeconds()
funciona para Int
argumentos. Se você deseja uma Double
versão, precisará decidir quais são os valores de retorno - podem (Int, Int, Double)
ou podem ser (Double, Double, Double)
. Você pode tentar algo como:
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
pode ser otimizado paraseconds % 60
. Não há necessidade de extrair as horas primeiro.printSecondstoHoursMinutesSeconds()
não retorna nada (veja o-> ()
tipo de retorno na declaração da função). A função imprime alguma coisa; que não aparece em um Playground. Se você quiser retornar algo, diga aString
, elimine aprintln()
chamada e corrija o tipo de retorno da função.Int
tipos devido à natureza das funções/
e%
. Ou seja,/
cai a parte faccional. O mesmo código não funcionaráDouble
. Especificamente 2 == 13/5, mas 2,6 == 13,0 / 5. Portanto, você precisaria de uma implementação diferente paraDouble
. Atualizei minha resposta com uma observação sobre isso.No macOS 10.10+ / iOS 8.0+
(NS)DateComponentsFormatter
foi introduzido para criar uma sequência legível.Ele considera o idioma e o idioma do usuário.
Os estilos de unidades disponíveis são
positional
,abbreviated
,short
,full
,spellOut
ebrief
.Para mais informações, leia a documentação .
fonte
formatter.unitsStyle = .positional
dá exatamente o que eu quero (que é7:30:05
)! Melhor resposta IMOhours * 3600 + minutes * 60
Com base na resposta de Vadian , escrevi uma extensão que pega um
Double
(queTimeInterval
é um alias de tipo) e cospe uma string formatada como tempo.Aqui estão as várias
DateComponentsFormatter.UnitsStyle
opções:fonte
Doubles
no Swift.formatter.zeroFormattingBehavior = .pad
. Isso nos daria:3660.asString(style: .positional) // 01:01:00
Criei um mashup de respostas existentes para simplificar tudo e reduzir a quantidade de código necessária para o Swift 3 .
Uso:
Impressões:
00:01:40
fonte
Aqui está uma abordagem mais estruturada / flexível: (Swift 3)
Ter uma abordagem como essa permite adicionar análises de conveniência como estas:
Deve-se notar que abordagens baseadas em números inteiros não levam em consideração o dia / segundo bissexto. Se o caso de uso estiver lidando com datas / horas reais, Data e calendário devem ser usados.
fonte
month
à sua implementação? Desde já, obrigado!return number < 10 ? "0\(number)" : "\(number)"
usando um formatador de stringreturn String(format: "%02d", number)
que adiciona automaticamente um zero quando o número estiver abaixo de 10No Swift 5:
Para chamar a função
Voltará 02:44:57
fonte
Swift 4
fonte
Aqui está outra implementação simples no Swift3.
fonte
Solução SWIFT 3.0 baseada aproximadamente na acima, usando extensões.
Usá-lo com o AVPlayer chamando assim?
fonte
Eu respondi a uma pergunta semelhante , no entanto, você não precisa exibir milissegundos no resultado. Portanto, minha solução requer iOS 10.0, tvOS 10.0, watchOS 3.0 ou macOS 10.12.
Você deve ligar
func convertDurationUnitValueToOtherUnits(durationValue:durationUnit:smallestUnitDuration:)
da resposta que eu já mencionei aqui:fonte
Swift 5:
Uso:
fonte
De acordo com a resposta do GoZoner , escrevi uma extensão para obter a hora formatada de acordo com as horas, minutos e segundos:
fonte
Aqui está o que eu uso para o meu Music Player no Swift 4+. Estou convertendo segundos Int em formato de String legível
Use assim:
Resultado:
2:11:43
fonte
A resposta de @ r3dm4n foi ótima. No entanto, eu também precisava de uma hora. Apenas no caso de alguém precisar também aqui está:
fonte
Código mais recente: XCode 10.4 Swift 5
fonte
Resposta rápida 5 & String, em formato apresentável
Uso:
fonte
A maneira mais simples:
fonte
ld
para double em vez ded
para int.NSTimeInterval
éDouble
fazê-lo com extensão. Exemplo:fonte
Fui em frente e criei um encerramento para isso (no Swift 3).
Isso fornecerá m = 4 es = 59. Portanto, você pode formatar isso como desejar. Você também pode querer adicionar horas, se não mais informações.
fonte
Swift 4 eu estou usando esta extensão
uso
fonte
a resposta de neek não está correta.
aqui está a versão correta
fonte
Outra maneira seria converter segundos para data e levar os componentes, ou seja, segundos, minutos e hora da própria data. Esta solução tem limitação apenas até 23:59:59
fonte