Pregunta

Me gustaría una forma de mostrar los tiempos naturales de los elementos con fecha en Python. Similar a cómo Twitter mostrará un mensaje de " hace un momento " ;, " hace unos minutos " ;, " hace dos horas " ;, " hace tres días " ;, etc.

Django 1.0 tiene un " humanizar " Método en django.contrib. No estoy usando el framework Django, e incluso si lo estuviera, es más limitado de lo que me gustaría.

Por favor, avíseme (y a las generaciones de futuros buscadores) si ya existe una buena solución de trabajo. Ya que esta es una tarea bastante común, me imagino que debe haber algo.

¿Fue útil?

Solución

Aunque no es útil para usted en este momento, puede serlo para futuros buscadores: El módulo babel, que se ocupa de todo tipo de cosas de configuración regional, tiene una función para hacer más o menos lo que quieras. Sin embargo, actualmente solo está en su baúl, no en la última versión pública (versión 0.9.4). Una vez que la funcionalidad llega a un lanzamiento, puedes hacer 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'

Esto se toma directamente de la documentación de babel sobre el formato del delta de tiempo . Esto al menos te llevará partes del camino. No hará borrosidad hasta el nivel de " hace unos momentos " y tal, pero hará " n minutos " correctamente pluralizado.

Para su valor, el módulo de babel también contiene funciones para formatear fechas y horas según la configuración regional, lo que podría ser útil cuando el delta del tiempo es grande.

Otros consejos

Las fechas de Twitter en particular son interesantes porque son relativas solo para el primer día. Después de 24 horas solo muestran mes y día. Después de un año comienzan a mostrar los dos últimos dígitos del año. Aquí hay una función de ejemplo que hace algo más parecido a las fechas relativas de Twitter, aunque siempre muestra el año también después de 24 horas. Es solo local de EE. UU., Pero siempre puede modificarlo según sea necesario.

# 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)

Hay el paquete 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'

Ejemplos para su 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'

Además (ver el enlace anterior) también admite la humanización de:

  • enteros
  • tamaños de archivo
  • flotadores (a números fraccionarios)

O puede adaptar fácilmente timesince.py de Django, que solo tiene otras 2 dependencias a sí mismo: una para la traducción (que puede que no necesite) y otra para las zonas horarias (que se pueden adaptar fácilmente).

Por cierto, Django tiene una licencia BSD que es bastante flexible, podrás usarlo en cualquier proyecto que estés usando actualmente.

¿Está buscando algo como esto (Impresión de fechas relativas) en Python)?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top