Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Afficher une durée proprement

+2 votes

J'utilise des datetime pour gérer les dates. Lorsque je les soustraits, je reçoit un timedelta.

J'ai envie d'afficher ce timedelta qui représente une durée dans le style "il y a 2 heures, 2 minutes" ou "Dans 2 jours, 1 heures".

J'ai cherché sur le net sans trouver. Je pense donc programmer la fonction mais je suis presque sûr que celle ci à déjà été écrite puisqu'elle existe en PHP il me semble.

demandé 14-Mai-2016 par Andy (372 points)
edité 14-Mai-2016 par max

2 Réponses

+4 votes
 
Meilleure réponse

Il y a http://sametmax.com/les-time-zones-en-python/ (voir la dernière ligne ) et la doc https://arrow.readthedocs.io/en/latest/ qui va bien

>>> import arrow 
>>> utc = arrow.utcnow()
>>> utc 
<Arrow [2013-05-11T21:23:58.970460+00:00]> 
>>> utc = utc.replace(hours=-1) 
>>> utc 
<Arrow [2013-05-11T20:23:58.970460+00:00]> 
>>> local = utc.to('US/Pacific')
>>> local 
<Arrow [2013-05-11T13:23:58.970460-07:00]> 
>>> arrow.get('2013-05-11T21:23:58.970460+00:00') 
<Arrow [2013-05-11T21:23:58.970460+00:00]> 
>>> local.timestamp
1368303838
>>> local.format() 
'2013-05-11 13:23:58 -07:00'  
>>> local.format('YYYY-MM-DD HH:mm:ss ZZ')
'2013-05-11 13:23:58 -07:00' 
>>> local.humanize()
'an hour ago'
répondu 14-Mai-2016 par foxmask (2,892 points)
sélectionné 17-Mai-2016 par Andy

+1 pour arrow avec humanize pour renvoyer une différence relative. Notez la possibilité de choisir une locale, du moment qu'elle est supportée.

0 votes

J'avais récup un bout de code dans le genre il y a longtemps, ça devrait faire l'affaire pour une partie de ce que tu veux.

def date_diff(timestamp):
    """
        return the time the object was created
        Ie: 2 days ago
    """
    if not timestamp:
        return ""

    compare_with = datetime.datetime.now()
    delta = compare_with - datetime.datetime.fromtimestamp(int(timestamp))

    if delta.days == 0:
        return ugettext("today")

    elif delta.days == -1:
        return ugettext("yesterday")

    chunks = (
        (365.0, lambda n: ungettext('year', 'years', n)),
        (30.0, lambda n: ungettext('month', 'months', n)),
        (7.0, lambda n: ungettext('week', 'weeks', n)),
        (1.0, lambda n: ungettext('day', 'days', n)),
    )
    for i, (chunk, name) in enumerate(chunks):
        if abs(delta.days) >= chunk:
            count = abs(int(delta.days / chunk))
            break

    date_str = str(count) + ' ' + unicode(name(count))

    return date_str
répondu 14-Mai-2016 par max (894 points)
...