Jak porównać dwie daty?

379

Jak porównać dwie daty, aby zobaczyć, która jest później, używając Pythona?

Na przykład chcę sprawdzić, czy bieżąca data przekroczyła ostatnią datę na liście, którą tworzę, z datami świąt, aby automatycznie wysłał wiadomość e-mail, informując administratora, aby zaktualizował plik holiday.txt.

Cecil Rodriguez
źródło
20
Eee, używasz operatorów <i >, tak jak w każdym innym porównaniu.
Daniel Roseman,
12
@JohnMachin: piszesz funkcję z prototypem int compare_dates(void const *, void const*), rzucasz oba argumenty struct Date *i implementujesz logikę porównania. Dla początkującego Pythona może to nie być tak oczywiste.
Fred Foo,
1
@larsmans: Przepraszamy .... s / any_language / any_reasonable_language / i każdy przyzwyczajony do nieuzasadnionego języka powinien poświęcić kilka minut na zapoznanie się z dokumentami i wypróbowanie date1 <date2
John Machin
2
docs.python.org/library/datetime.html#datetime-objects Ctrl-F wyszukaj „Obsługiwane operacje”
John Machin
1
@Galaxy - używa analogii, aby pokazać, że to, co powinno być proste dla doświadczonej osoby, może nie być proste dla początkującego użytkownika i używa C do zilustrowania tego. Nie sądzi, by pytanie dotyczyło C. I miał rację, byłem kompletnym początkującym, kiedy zadawałem to pytanie prawie 8 lat temu i nie miałem pojęcia, jak to wszystko działa.
Cecil Rodriguez

Odpowiedzi:

494

Użyj datetimemetody oraz operatora <i jego krewnych.

>>> 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
źródło
19
Działa to również w przypadku wartości uwzględniających strefę czasową, jeśli ktoś się zastanawia.
Mat Gessel,
2
Czym różni się od pasti present? Nie rozumiem twojego przykładu, a jego wynik nie ma sensu.
Emadpres,
19
@Emadpres: wyobraź sobie, że to zostało wpisane ręcznie. Wcześniejsza linia została wpisana jako pierwsza, podczas gdy obecna linia została wpisana jako druga ... tak więc poprzednia linia została wprowadzona jako pierwsza, więc przeszłość <teraźniejszość jest Prawdą.
ramcdougal,
2
Cytując z dokumentu: „Jeśli jedno porównanie jest naiwne, a drugie jest świadome, błąd TypeError jest wywoływany przy próbie porównania zamówień. W przypadku porównań równości instancje naiwne nigdy nie są równe wystąpieniom świadomym. Jeśli oba porównania są świadome i mają takie same Atrybut tzinfo, wspólny atrybut tzinfo jest ignorowany i porównywane są podstawowe czasy danych. Jeśli oba porównania są świadome i mają różne atrybuty tzinfo, porównania są najpierw korygowane poprzez odjęcie ich przesunięć UTC (uzyskanych z self.utcoffset ()). ”
Vikas Prasad
2
Nazwy zmiennych powinny być pasti past_but_a_little_after. Technicznie presentjest to także przeszłość, gdy past < presentdokonywane jest porównanie .
grisaitis
74

Posługiwać się time

Powiedzmy, że masz początkowe daty jako ciągi takie jak te:
date1 = "31/12/2015"
date2 = "01/01/2016"

Możesz wykonać następujące czynności:
newdate1 = time.strptime(date1, "%d/%m/%Y")i newdate2 = time.strptime(date2, "%d/%m/%Y")przekonwertować je na format daty Pythona. Porównanie jest więc oczywiste:

newdate1 > newdate2wróci False
newdate1 < newdate2, wróciTrue

Guillermo Pereira
źródło
39

datetime.date(2011, 1, 1) < datetime.date(2011, 1, 2)wróci True.

datetime.date(2011, 1, 1) - datetime.date(2011, 1, 2)wróci datetime.timedelta(-1).

datetime.date(2011, 1, 1) + datetime.date(2011, 1, 2)wróci datetime.timedelta(1).

zobacz dokumenty .

Daniel Nill
źródło
3

Inne odpowiedzi datetimei porównania działają również tylko dla czasu, bez daty.

Na przykład, aby sprawdzić, czy teraz jest mniej więcej 8:00, możemy użyć:

import datetime

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

A później porównaj z:

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

który wróci True

Luis
źródło
-1

Aby obliczyć różnicę dni w dwóch datach, można wykonać jak poniżej:

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

Ponieważ jeśli sekunda jest dłuższa od terminu płatności, musimy naliczyć opłatę

Pallavi Sharma
źródło
Nie odpowiada na pytanie.
Willwsharp