Pergunta

Queria uma maneira de mostrar tempos naturais para itens datados em Python. Semelhante à maneira como o Twitter mostrará uma mensagem de "A MOMENTE atrás", "alguns minutos atrás", "duas horas atrás", "três dias atrás", etc.

O Django 1.0 possui um método "Humanize" em Django.Contrib. Não estou usando a estrutura do Django e, mesmo se eu fosse, é mais limitado do que gostaria.

Informe -me (e gerações de futuros pesquisadores) saibam se já existe uma boa solução de trabalho. Como essa é uma tarefa suficientemente comum, imagino que deve haver algo.

Foi útil?

Solução

Embora não seja útil para você neste exato momento, pode ser assim para futuros pesquisadores: o módulo Babel, que lida com todo tipo de material de localidade, tem uma função para fazer mais ou menos o que você deseja. Atualmente, ele está apenas no porta -malas deles, não no último lançamento público (versão 0.9.4). Depois que a funcionalidade terminar em um lançamento, você poderá fazer algo como:

from datetime import timedelta
from babel.dates import format_timedelta
delta = timedelta(days=6)
format_timedelta(delta, locale='en_US')
u'1 week'

Isso é retirado de A documentação de Babel na formatação delta de tempo. Isso pelo menos fará parte de partes do caminho. Não fará a fuzziness até o nível de "momentos atrás" e tal, mas fará "n minutos" etc. pluralizados corretamente.

Pelo que vale a pena, o módulo Babel também contém funções para a formatação de datas e horários de acordo com a Locale, o que pode ser útil quando o tempo que o delta for grande.

Outras dicas

As datas do Twitter em específicas são interessantes porque são relativas apenas para o primeiro dia. Depois de 24 horas, eles apenas mostram o mês e o dia. Depois de um ano, eles começam a mostrar os dois últimos dígitos do ano. Aqui está uma função de amostra que faz algo mais parecido com as datas relativas do Twitter, embora sempre mostre o ano após 24 horas. Somos apenas os locais dos EUA, mas você sempre pode alterá -lo conforme necessário.

# tested in Python 2.7
import datetime
def prettydate(d):
    diff = datetime.datetime.utcnow() - d
    s = diff.seconds
    if diff.days > 7 or diff.days < 0:
        return d.strftime('%d %b %y')
    elif diff.days == 1:
        return '1 day ago'
    elif diff.days > 1:
        return '{} days ago'.format(diff.days)
    elif s <= 1:
        return 'just now'
    elif s < 60:
        return '{} seconds ago'.format(s)
    elif s < 120:
        return '1 minute ago'
    elif s < 3600:
        return '{} minutes ago'.format(s/60)
    elif s < 7200:
        return '1 hour ago'
    else:
        return '{} hours ago'.format(s/3600)

o pacote humanize:

>>> import humanize
>>> import datetime
>>> humanize.naturalday(datetime.datetime.now())
'today'
>>> humanize.naturalday(datetime.datetime.now() - datetime.timedelta(days=1))
'yesterday'
>>> humanize.naturalday(datetime.date(2007, 6, 5))
'Jun 05'
>>> humanize.naturaldate(datetime.date(2007, 6, 5))
'Jun 05 2007'
>>> humanize.naturaltime(datetime.datetime.now() - datetime.timedelta(seconds=1))
'a second ago'
>>> humanize.naturaltime(datetime.datetime.now() - datetime.timedelta(seconds=3600))
'an hour ago'

Exemplos para o seu caso de uso:

>>> humanize.naturaltime(datetime.datetime.now() - datetime.timedelta(seconds=36000))
'10 hours ago'
>>> humanize.naturaltime(datetime.datetime.now() - datetime.timedelta(seconds=360000))
'4 days ago'
>>> humanize.naturaltime(datetime.datetime.now() - datetime.timedelta(seconds=3600000))
'a month ago'

Além disso (veja o link acima) também suporta a humanização de:

  • Inteiros
  • Tamanhos de arquivo
  • carros alegóricos (para números fracionários)

Ou você pode facilmente se adaptar timesince.py do Django, que possui apenas 2 outras dependências para si mesmo: uma para tradução (que você pode não precisar) e outra para fusos horários (que podem ser facilmente adaptados).

A propósito, Django tem uma licença BSD O que é bastante flexível, você poderá usá -lo em qualquer projeto que esteja usando atualmente.

Você está procurando algo assim (Imprimir datas relativas em Python)?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top