64 votes

Comparaisons de dates en Python

Je voudrais savoir si un objet datetime python particulier est plus ancien que X heures ou minutes. J'essaie de faire quelque chose de similaire :

if (datetime.now() - self.timestamp) > 100
# Where 100 is either seconds or minutes

Cela génère une erreur de type.

Quelle est la bonne façon de faire une comparaison date-heure en python ? J'ai déjà regardé WorkingWithTime ce qui est proche mais pas exactement ce que je veux. Je suppose que je veux simplement que l'objet datetime soit représenté en secondes afin de pouvoir effectuer une comparaison normale avec des int.

Veuillez publier des listes des meilleures pratiques en matière de date.

0 votes

datetime.now() (ou toute autre heure locale indiquée en tant que naïf ) peut échouer lors des transitions DST ou des modifications du décalage UTC pour le fuseau horaire local pour d'autres raisons. L'heure UTC ou un objet datetime conscient devrait être utilisé à la place, par exemple, datetime.utcnow() o datetime.now(timezone.utc).astimezone() .

111voto

John Millikin Points 86775

Utilisez le datetime.timedelta classe :

>>> from datetime import datetime, timedelta
>>> then = datetime.now() - timedelta(hours = 2)
>>> now = datetime.now()
>>> (now - then) > timedelta(days = 1)
False
>>> (now - then) > timedelta(hours = 1)
True

Votre exemple pourrait être écrit comme suit :

if (datetime.now() - self.timestamp) > timedelta(seconds = 100)

o

if (datetime.now() - self.timestamp) > timedelta(minutes = 100)

5voto

William Points 4403

Comparez la différence avec un timedelta que vous créez :

if datetime.datetime.now() - timestamp > datetime.timedelta(seconds = 5):
    print 'older'

5voto

Chong Ying Fan Points 41

Alternatif :

if (datetime.now() - self.timestamp).total_seconds() > 100:

En supposant que self.timestamp est une instance de datetime

1 votes

Il convient de mentionner que total_seconds() est disponible depuis Python 2.7.

1voto

Jerub Points 17488

Vous pouvez utiliser une combinaison des attributs 'days' et 'seconds' de l'objet retourné pour trouver la réponse, comme ceci :

def seconds_difference(stamp1, stamp2):
    delta = stamp1 - stamp2
    return 24*60*60*delta.days + delta.seconds + delta.microseconds/1000000.

Utilisez abs() dans la réponse si vous voulez toujours un nombre positif de secondes.

Pour savoir combien de secondes dans le passé se trouve un horodatage, vous pouvez l'utiliser comme suit :

if seconds_difference(datetime.datetime.now(), timestamp) < 100:
     pass

0voto

William Keller Points 2845

Vous pouvez soustraire deux datetime pour trouver la différence entre les deux.
Vous pouvez utiliser datetime.fromtimestamp pour analyser un horodateur POSIX.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X