Comment comparer deux dates?

382

Comment pourrais-je comparer deux dates pour voir celle qui est plus tard, en utilisant Python?

Par exemple, je veux vérifier si la date actuelle est au-delà de la dernière date de la liste que je crée, des dates de vacances, afin qu'il envoie automatiquement un e-mail, en disant à l'administrateur de mettre à jour le fichier holiday.txt.

Cecil Rodriguez
la source
20
Euh, vous utilisez les opérateurs <et >, comme pour toute autre comparaison.
Daniel Roseman du
12
@JohnMachin: vous écrivez une fonction avec un prototype int compare_dates(void const *, void const*), convertissez les deux arguments struct Date *et implémentez la logique de comparaison. Ce n'est peut-être pas si évident pour un nouveau venu en Python.
Fred Foo
1
@larsmans: Désolé .... s / any_language / any_reasonable_language / et toute personne habituée à une langue déraisonnable devrait passer quelques minutes à parcourir les documents et à essayer date1 <date2
John Machin
2
docs.python.org/library/datetime.html#datetime-objects Recherche Ctrl-F pour "Opérations prises en charge"
John Machin
1
@Galaxy - il utilise une analogie, pour montrer que ce qui devrait être simple pour une personne chevronnée peut ne pas être simple pour un débutant total et il utilise C pour illustrer cela. Il ne pense pas que la question concerne C.
Cecil Rodriguez

Réponses:

497

Utilisez la datetimeméthode et l'opérateur <et ses parents.

>>> from datetime import datetime, timedelta
>>> past = datetime.now() - timedelta(days=1)
>>> present = datetime.now()
>>> past < present
True
>>> datetime(3000, 1, 1) < present
False
>>> present - datetime(2000, 4, 4)
datetime.timedelta(4242, 75703, 762105)
Fred Foo
la source
19
Cela fonctionne également pour les valeurs sensibles au fuseau horaire, si quelqu'un se le demandait.
Mat Gessel
2
Qu'est-ce qui est différent entre pastet present? Je ne peux pas comprendre votre exemple et son résultat n'a pas de sens.
Emadpres
19
@Emadpres: imaginez que cela a été tapé manuellement. La ligne passée a été tapée en premier, tandis que la ligne actuelle a été tapée en second ... donc la ligne passée a été entrée en premier, donc passé <présent est Vrai.
ramcdougal
2
Citation du document: "Si un comparand est naïf et que l'autre est conscient, TypeError est levée si une comparaison d'ordre est tentée. Pour les comparaisons d'égalité, les instances naïves ne sont jamais égales aux instances conscientes. Si les deux comparands sont conscients et ont le même attribut tzinfo, l'attribut tzinfo commun est ignoré et les heures de base sont comparées. Si les deux comparands sont conscients et ont des attributs tzinfo différents, les comparands sont d'abord ajustés en soustrayant leurs décalages UTC (obtenus à partir de self.utcoffset ()). "
Vikas Prasad du
2
Les noms des variables doivent être pastet past_but_a_little_after. Techniquement, presentc'est aussi dans le passé lorsque la comparaison past < presentest faite.
grisaitis
75

Utilisation time

Disons que vous avez les dates initiales sous forme de chaînes comme celles-ci:
date1 = "31/12/2015"
date2 = "01/01/2016"

Vous pouvez effectuer les opérations suivantes:
newdate1 = time.strptime(date1, "%d/%m/%Y")et newdate2 = time.strptime(date2, "%d/%m/%Y")les convertir au format de date de python. Ensuite, la comparaison est évidente:

newdate1 > newdate2reviendra False
newdate1 < newdate2reviendraTrue

Guillermo Pereira
la source
40

datetime.date(2011, 1, 1) < datetime.date(2011, 1, 2)reviendra True.

datetime.date(2011, 1, 1) - datetime.date(2011, 1, 2)reviendra datetime.timedelta(-1).

datetime.date(2011, 1, 1) + datetime.date(2011, 1, 2)reviendra datetime.timedelta(1).

voir les documents .

Daniel Nill
la source
3

Les autres réponses utilisant datetimeet les comparaisons fonctionnent également uniquement pour le temps, sans date.

Par exemple, pour vérifier s'il est actuellement plus ou moins de 8h00, nous pouvons utiliser:

import datetime

eight_am = datetime.time( 8,0,0 ) # Time, without a date

Et comparer plus tard avec:

datetime.datetime.now().time() > eight_am  

qui reviendra True

Luis
la source
-1

Pour calculer les jours en deux dates de différence, vous pouvez faire comme ci-dessous:

import datetime
import math

issuedate = datetime(2019,5,9)   #calculate the issue datetime
current_date = datetime.datetime.now() #calculate the current datetime
diff_date = current_date - issuedate #//calculate the date difference with time also
amount = fine  #you want change

if diff_date.total_seconds() > 0.0:   #its matching your condition
    days = math.ceil(diff_date.total_seconds()/86400)  #calculate days (in 
    one day 86400 seconds)
    deductable_amount = round(amount,2)*days #calclulated fine for all days

Parce que si une seconde est plus avec la date d'échéance, nous devons facturer

Pallavi Sharma
la source
Ne répond pas à la question.
Willwsharp