FYI, essa função é custosa (demora mais que o método ideal pra ser executada, ou seja, é lenta) por causa dos whiles. Imagine o seu exemplo com o os.time(). Só para calcular os anos, o while rodou 43 vezes.
Existe um método melhor para converter esse tipo de dados, usando módulo (em Lua, é o operador %). O módulo retorna o resto de uma divisão, ou seja:
8 % 3 => 2
Significa que 8 dividido por 3 resta 2.
Usando isso, podemos converter um número de segundos em minutos, horas, ou o que for, usando uma operação matemática, que pode ser executada "instantaneamente".
Supondo que temos 100 segundos, que equivalem à 1 minuto e 40 segundos. Se dividirmos 100 por 60, obteremos 1.666... A parte fracionária desse número (0.666...) equivale aos outros 40 segundos. Se pegarmos somente e parte inteira (1), já temos o número de minutos! Mas agora precisamos ajustar o número de segundos que sobraram. Para isso, usamos o módulo para pegar o resto da divisão. Se pegarmos o resto da divisão de 100 por 60, dá 40. Com isso, podemos fazer o código que pega o número de minutos do os.time(), por exemplo.
local seconds = os.time() local minutes = math.floor(seconds / 60) -- Pega o número de minutos em "seconds" seconds = seconds % 60 -- Ajusta os segundos que sobraram
Para pegar o número de horas em tantos minutos, dias em tantas horas, meses em tantos dias, anos em tantos meses e et cetera, a ideia é exatamente a mesma.
local seconds = os.time() local minutes, hours, days, months, years minutes = math.floor(seconds / 60) seconds = seconds % 60 hours = math.floor(minutes / 60) minutes = minutes % 60 days = math.floor(hours / 24) hours = hours % 24 months = math.floor(days / 30) days = days % 30 years = math.floor(months / 12) months = months % 12
Edit: Só por curiosidade, o os.time() retorna o tempo do sistema, que geralmente é medido em número de segundos decorridos desde o "epoch" (no tempo POSIX). Ou seja, o número de segundos desde 1 de Janeiro de 1970. Por isso dá 43 anos. Estamos em 2013: 2013-1970=43!
![]()



info
Grupo: Barão
Registrado: 19/11/11
Posts: 221
Reputação: +70
Bom, o que ela faz é retornar o valor em horas, minutos e segundos baseado em um tempo de segundos...
Por exemplo:
formatTimeBySeconds(60)
h = 0
m = 1
s = 0
formatTimeBySeconds(1800) (60*30=meia hora)
h = 0
m = 30
s = 0
formatTimeBySeconds(3665)
h = 1
m = 1
s = 5
Espero que tenham entendido
A função:
http://pastebin.com/Mkqf7gJe
Observações:
Ela retorna um array com, respectivamente, as horas, os minutos e os segundos do tempo que você inseriu
EXEMPLO USANDO 3665 SEGUNDOS
Resultado no console: horas: 1 / minutos: 1 / segundos: 5
Preferi deixar assim porque você nem sempre precisa saber as horas, ou os segundos de um tempo.
Coisas legais que descobri:
os.time() tem 43 anos, 19 dias (vai aumentando conforme o tempo passa) - ou, caso prefira, 377.150 horas!
Editado Janeiro 9 por 20cm