Question

Je voudrais un moyen de montrer des heures naturelles pour les éléments datés en Python. Semblable à la manière dont Twitter affichera un message de "il y a un instant", "il y a quelques minutes", "il y a deux heures", "il y a trois jours", etc.

Django 1.0 a un "humaniser" méthode dans django.contrib. Je n'utilise pas le framework Django, et même si c'était le cas, il est plus limité que ce que je voudrais.

S'il vous plaît, laissez-moi (ainsi que les générations de futurs chercheurs) savoir s'il existe déjà une bonne solution. Puisqu'il s'agit d'une tâche assez commune, j'imagine qu'il doit y avoir quelque chose.

Était-ce utile?

La solution

Bien que cela ne vous soit pas utile en ce moment, il peut en être de même pour les futurs chercheurs: Le module babel, qui traite de toutes sortes de paramètres régionaux, a une fonction permettant de faire plus ou moins ce que vous voulez. Actuellement, c'est seulement dans leur coffre, pas dans la dernière version publique (version 0.9.4). Une fois que la fonctionnalité a atterri dans une version, vous pouvez faire quelque chose comme:

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

Ceci provient directement de la la documentation de Babel sur le formatage delta horaire . Cela vous aidera au moins à vous frayer un chemin. Cela ne fera pas de flou jusqu'au niveau de " il y a quelques instants " et autres, mais cela fera "n minutes". etc. correctement pluralisé.

Pour ce que cela vaut, le module babel contient également des fonctions permettant de formater les dates et les heures en fonction des paramètres régionaux, ce qui pourrait être utile lorsque le delta temporel est grand.

Autres conseils

Les dates Twitter en particulier sont intéressantes car elles ne sont relatives que pour le premier jour. Après 24 heures, ils affichent simplement le mois et le jour. Après un an, ils commencent à afficher les deux derniers chiffres de l'année. Voici un exemple de fonction qui s'apparente davantage aux dates relatives sur Twitter, même si elle affiche toujours l'année aussi après 24 heures. Il s’agit uniquement de paramètres régionaux américains, mais vous pouvez toujours les modifier si nécessaire.

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

Il existe le paquet humaniser :

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

Exemples pour votre cas d'utilisation:

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

En outre (voir lien ci-dessus), il prend également en charge l'humanisation de:

  • entiers
  • tailles de fichier
  • flotte (vers des nombres fractionnaires)

Vous pouvez également adapter timesince.py . de Django qui ne possède que 2 autres dépendances: une pour la traduction (dont vous n’avez peut-être pas besoin) et une pour les fuseaux horaires (qui peuvent être facilement adaptés).

Au fait, Django a une licence BSD assez flexible, vous pourrez l'utiliser dans le projet que vous utilisez actuellement.

Recherchez-vous quelque chose comme ce modèle (Impression de dates relatives en Python)?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top