quinta-feira, 18 de dezembro de 2008

Calculando tempo decorrido em Python

Bom, não sei quantos de vocês aqui já usaram IRC e se lembram dos bons e velhos tempos onde os bots tinham um recurso legal de se saber quando foi a última vez que um nick foi visto. Entre outros comandos, esse era um dos mais úteis na minha opinião.

Então, hoje eu resolvi implementar um sisteminha para meu bot (que ainda não têm nenhum hehehe) para justamente saber quando um determinado nick foi visto pela última vez. A parte de registrar a hora que o nick deixou sua última mensagem, ou mesmo mudou de nick ou se desconectou nem é difícil. O que me deu um nó na cabeça era como mostrar essa informação de um modo amigável, já que mostrar Nick Vndmtrx foi visto há 136 dias ou mesmo Caeryn saiu há 450 horas não ajuda muito. Foi pensando nisso que fiz um código simples (e bem POG) para resolver esse problema...

def epoch(segundos):
#(tm_year, tm_mon, tm_mday, tm_hour, tm_min, tm_sec, tm_wday, tm_yday, tm_isdst)
#POG: >>> time.gmtime(0)
# (1970, 1, 1, 0, 0, 0, 3, 1, 0)
listatempo = []
tempo = list(time.gmtime(segundos))
tempo[0] -= 1970
tempo[1] -= 1
tempo[2] -= 1
nomes = (('ano','anos'),('mês','meses'),('dia','dias'),('hora','horas'),('minuto','minutos'),('segundo','segundos'))
for x in range(6):
if tempo[x] != 0:
if tempo[x] == 1:
listatempo.append('%s %s' % (tempo[x], nomes[x][0]))
else:
listatempo.append('%s %s' % (tempo[x], nomes[x][1]))
if len(listatempo) >= 2:
retorno = ', '.join(listatempo[:-1]) + ' e ' + listatempo[-1]
elif len(listatempo) == 1:
retorno = listatempo[0]
else:
retorno = ''.join(listatempo)
return retorno


Essencialmente, o que o código faz é converter o número de segundos que se passou desde o evento até o momento atual e enviar ele para a função, que trata de criar uma string já formatada com a divisão de dias, meses, anos, horas, minutos e segundos. Nem é tão difícil depois que está pronta, mas na hora deu um trabalhão daqueles para pensar uma solução que não fosse muito feia. Essa daí está feinha, mas está pelo menos com poucas linhas, o que não é consolo, claro.

Os POGs do final do código eu coloquei para deixar a string mais certinha com o português, como 3 horas, 37 minutos e 12 segundos. Espero que entendam.

Abaixo posto um exemplo de como usar esse nosso código. aproveite.
>>> x
1229612274.201154 #18/12/2008 14:57:54 UTC
>>> y
1229620115.212635 #18/12/2008 17:08:35 UTC
>>> time.gmtime(x)
(2008, 12, 18, 14, 57, 54, 3, 353, 0)
>>> time.gmtime(y)
(2008, 12, 18, 17, 8, 35, 3, 353, 0)
>>> time.gmtime(y - x)
(1970, 1, 1, 2, 10, 41, 3, 1, 0)
>>> epoch(x)
'38 anos, 11 meses, 17 dias, 14 horas, 57 minutos e 54 segundos'
>>> epoch(y)
'38 anos, 11 meses, 17 dias, 17 horas, 8 minutos e 35 segundos'
>>> epoch(y - x)
'2 horas, 10 minutos e 41 segundos'

Taí, espero que tenha sido útil. Abração.