Je construis un système d'utilisateurs, où chaque utilisateur a une page de profil. Je lance un travail cron chaque semaine pour donner des points aux utilisateurs en fonction de ceux qui ont mis à jour leur profil le plus récemment. Pour cela, j'ai entre 1-100 points à donner.

L'idée est par exemple: si l'utilisateur A mettait à jour son profil aujourd'hui, l'utilisateur A obtiendrait 100 points, si le profil était mis à jour hier, ce serait 99 points et la veille ce serait 98 points et ainsi de suite

Si un utilisateur mettait à jour son profil il y a 100 jours ou plus, le score serait alors 0.

Maintenant, le problème que j'ai est de changer la date de updated_on en nombre.

J'ai ce code, que je récupère de la base de données, mais je suis bloqué.

updated_on = datetime.datetime.strptime(str(updated_on_date), '%Y-%m-%d %H:%M:%S').date()

if updated_on   .... ?:
    rank  = 100
elif
   ... 
2
soni-b3196413 8 mars 2016 à 15:47

3 réponses

Meilleure réponse

Il n'est pas nécessaire de faire str(updated_on_date) car updated_on_date est déjà une chaîne. Je suppose que ces dates sont en UTC, car l'utilisation de l'heure locale mène à la folie. :)

Vous pouvez obtenir le datetime actuel en UTC en utilisant current_date = datetime.utcnow(). Dans le code ci-dessous, je coderai simplement la date d'aujourd'hui afin que les futurs lecteurs obtiennent la même sortie que moi.

Le module datetime fournit un objet datetime.timedelta, qui vous permet d'effectuer une arithmétique avec des objets datetime.datetime. Vous pouvez ajouter un timedelta à un datetime pour obtenir un nouveau datetime, et si vous soustrayez un datetime d'un autre, le résultat est un timedelta. Il est donc très facile d'obtenir le nombre de jours entre deux dates.

from datetime import datetime

dates = (
    '2016-03-08 00:00:00',
    '2016-03-07 00:00:00',
    '2016-03-01 00:00:00',
    '2015-11-30 00:00:00',
    '2015-11-29 00:00:00',
    '2015-11-20 00:00:00',
)

#current_date = datetime.utcnow()
current_date = datetime(2016, 3, 8)
print('current', current_date)

for datestr in dates:
    updated_on = datetime.strptime(datestr, '%Y-%m-%d %H:%M:%S')
    delta = (current_date - updated_on).days
    rank = max(0, 100 - delta)
    print('updated', updated_on, 'delta', delta, 'rank', rank) 

sortie

current 2016-03-08 00:00:00
updated 2016-03-08 00:00:00 delta 0 rank 100
updated 2016-03-07 00:00:00 delta 1 rank 99
updated 2016-03-01 00:00:00 delta 7 rank 93
updated 2015-11-30 00:00:00 delta 99 rank 1
updated 2015-11-29 00:00:00 delta 100 rank 0
updated 2015-11-20 00:00:00 delta 109 rank 0
1
PM 2Ring 8 mars 2016 à 13:34
>>> from datetime import date
>>> today = date.today()
>>> sample = [date(2015,5,27), date(2016,3,4), date(2015,12,31), today]
>>> for updated_on in sample:
...     delta = today - updated_on
...     rank = max(0, 100 - delta.days)
...     print("updated on: {} -> rank: {}".format(updated_on, rank))
...
updated on: 2015-05-27 -> rank: 0
updated on: 2016-03-04 -> rank: 96
updated on: 2015-12-31 -> rank: 32
updated on: 2016-03-08 -> rank: 100
2
Michael Amrhein 8 mars 2016 à 13:20

En utilisant cet exemple, vous pouvez calculer le nombre de jours entre deux dates:

date1 = datetime.datetime.strptime(str('2016-01-01 23:00:00'), '%Y-%m-%d %H:%M:%S')
date2 = datetime.datetime.strptime(str('2016-03-08 23:00:00'), '%Y-%m-%d %H:%M:%S')
number_of_days = date2 -date1
print(number_of_days.days)

Imprimera le nombre total de jours entre date1 et date2.

0
PM 2Ring 8 mars 2016 à 15:10