Domanda

Vorrei un modo per mostrare i tempi naturali per gli oggetti datati in Python. Simile a come Twitter mostrerà un messaggio di "un momento fa", "pochi minuti fa", "due ore fa", "tre giorni fa", ecc.

Django 1.0 ha un " umanize " metodo in django.contrib. Non sto usando il framework Django e, anche se lo fossi, è più limitato di quello che vorrei.

Per favore fatemi sapere (e generazioni di futuri ricercatori) se esiste già una buona soluzione funzionante. Dal momento che questo è un compito abbastanza comune, immagino che ci debba essere qualcosa.

È stato utile?

Soluzione

Anche se non ti è utile in questo momento, potrebbe essere così per i futuri ricercatori: Il modulo babel, che si occupa di tutti i tipi di cose locali, ha una funzione per fare più o meno quello che vuoi. Attualmente è solo nel loro trunk, non nell'ultima versione pubblica (versione 0.9.4). Una volta che la funzionalità arriva in una versione, potresti fare qualcosa del tipo:

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

Questo è tratto direttamente dalla la documentazione babel sulla formattazione delta temporale . Questo ti porterà almeno in parte. Non farà confusione fino al livello di "momenti fa" e tale, ma farà "n minuti" ecc. correttamente pluralizzato.

Per quello che vale, il modulo babel contiene anche funzioni per la formattazione di date e orari in base alle impostazioni locali, il che potrebbe essere utile quando il delta temporale è grande.

Altri suggerimenti

Le date di Twitter in particolare sono interessanti perché sono relative solo per il primo giorno. Dopo 24 ore mostrano solo il mese e il giorno. Dopo un anno iniziano a mostrare le ultime due cifre dell'anno. Ecco una funzione di esempio che fa qualcosa di più simile alle date relative di Twitter, anche se mostra sempre anche l'anno dopo 24 ore. È solo locale USA, ma puoi sempre modificarlo secondo necessità.

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

Esiste il pacchetto umanizzare :

>>> 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'

Esempi per il tuo caso d'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'

Inoltre (vedi link sopra) supporta anche l'umanizzazione di:

  • interi
  • dimensioni dei file
  • float (in numeri frazionari)

Oppure potresti adattare facilmente timesince.py da Django che ha solo altre 2 dipendenze: una per la traduzione (di cui potresti non aver bisogno) e una per i fusi orari (che possono essere facilmente adattati).

A proposito, Django ha una licenza BSD che è piuttosto flessibile, sarai in grado di usarlo in qualunque progetto tu stia attualmente utilizzando.

Stai cercando qualcosa del genere (Stampa di date relative in Python)?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top