Bienvenue sur IndexError.

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

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

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 (366 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,888 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 (892 points)
...