web-dev-qa-db-fra.com

Déterminer les "jours" dans python lorsque le timedelta.days est inférieur à un

désolé à l'avance si c'est dense. J'essaie de trouver les jours depuis la dernière fois que j'ai publié un Tweet. Le problème que je rencontre est lorsque les dates sont différentes, par exemple, aujourd'hui et hier, mais pas assez d'heures se sont écoulées pour être une "journée" complète.

# "created_at" is part of the Twitter API, returned as UTC time. The 
# timedelta here is to account for the fact I am on the west coast, USA 
lastTweetAt =  result.created_at + timedelta(hours=-8)

# get local time
rightNow = datetime.now()

# subtract the two datetimes (which gives me a timedelta)
dt = rightNow - lastTweetAt

# print the number of days difference
print dt.days

Le problème est que si j'ai posté un Tweet à disons 5 PM hier et que j'exécute le script à 8 heures aujourd'hui, seulement 15 heures se sont écoulées, ce qui est 0 jour. Mais évidemment, je veux dire cela fait 1 jour depuis mon dernier Tweet si c'était hier. Et un coup de tête d'ajouter "+1" ne va pas aider parce que si j'ai tweeté aujourd'hui, je veux que le résultat soit 0.

Existe-t-il une meilleure approche que d'utiliser timedelta pour faire la différence?


Solution fourni par Matti Lyra

La réponse est d'appeler .date () sur les horaires afin qu'ils soient convertis en objets de date plus grossiers (sans horodatage). Le code correct ressemble à:

# "created_at" is part of the Twitter API, returned as UTC time.
# the -8 timedelta is to account for me being on the west coast, USA
lastTweetAt =  result.created_at + timedelta(hours=-8)

# get UTC time for right now
rightNow = datetime.now()

# truncate the datetimes to date objects (which have dates, but no timestamp)
# and subtract them (which gives me a timedelta)
dt = rightNow.date() - lastTweetAt.date()

# print the number of days difference
print dt.days
15
psxndc

Vous pouvez utiliser datetime.date() pour comparer les deux dates (note: PAS les dates avec les heures), cela tronque le datetime pour avoir une résolution des jours et non des heures.

...
# subtract the two datetimes (which gives me a timedelta)
dt = rightNow.date() - lastTweetAt.date()
...

Les docs sont toujours vos amis

http://docs.python.org/2/library/datetime#datetime.datetime.date

8
Matti Lyra

Que diriez-vous de ne traiter que la partie "date" de vos horaires?

La partie après la sortie de "0" dans le code suivant:

>>> a = datetime.datetime.now()
>>> b = datetime.datetime.now() - datetime.timedelta(hours=20)
>>> (a-b).days
0
>>> b.date() - a.date()
datetime.timedelta(-1)
>>> (b.date() - a.date()).days
-1
6
BorrajaX