Come confrontare due date?


381

Come potrei confrontare due date per vedere quale è più tardi, usando Python?

Ad esempio, voglio verificare se la data corrente è passata all'ultima data in questo elenco che sto creando, delle date delle festività, in modo che invierà automaticamente un'e-mail, dicendo all'amministratore di aggiornare il file holiday.txt.


20
Ehm, usi gli operatori <e >, proprio come con qualsiasi altro confronto.
Daniel Roseman,

12
@JohnMachin: si scrive una funzione con prototipo int compare_dates(void const *, void const*), si lanciano entrambi gli argomenti struct Date *e si implementa la logica di confronto. Potrebbe non essere così ovvio per un nuovo arrivato di Python.
Fred Foo,

1
@larsmans: Mi dispiace .... s / any_language / any_reasonable_language / e chiunque sia abituato a un linguaggio irragionevole dovrebbe passare qualche minuto a leggere i documenti e a provare date1 <date2
John Machin


1
@Galaxy - sta usando un'analogia, per dimostrare che ciò che dovrebbe essere semplice per una persona esperta potrebbe non essere semplice per un principiante totale e sta usando C per illustrarlo. Non pensa che la domanda riguardi C. Ed aveva ragione, ero un principiante assoluto quando ho fatto questa domanda quasi 8 anni fa, e non avevo idea di come funzionasse.
Cecil Rodriguez,

Risposte:


496

Usa il datetimemetodo, l'operatore <e i suoi parenti.

>>> 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)

19
Questo funziona anche per i valori sensibili al fuso orario, se qualcuno si chiedeva.
Mat Gessel

2
Cosa c'è di diverso tra paste present? Non riesco a capire il tuo esempio e il suo risultato non ha senso.
Emadpres,

19
@Emadpres: immagina che questo sia stato digitato manualmente. La riga passata è stata digitata per prima, mentre la riga presente è stata digitata per seconda ... quindi la riga passata è stata inserita per prima, quindi past <present è True.
Ramcdougal,

2
Citando dal documento: "Se un confronto è ingenuo e l'altro è consapevole, TypeError viene generato se si tenta un confronto di ordini. Per i confronti di uguaglianza, le istanze ingenue non sono mai uguali alle istanze consapevoli. Se entrambi i confronti sono consapevoli e hanno lo stesso tzinfo, l'attributo tzinfo comune viene ignorato e vengono confrontati i tempi dei dati di base. Se entrambi i confronti sono a conoscenza e hanno attributi tzinfo diversi, i confronti vengono prima regolati sottraendo i loro offset UTC (ottenuti da self.utcoffset ()). "
Vikas Prasad,

2
I nomi delle variabili dovrebbero essere paste past_but_a_little_after. Tecnicamente, presentè anche nel passato quando past < presentviene effettuato il confronto .
Grisaitis,

75

Uso time

Supponiamo che tu abbia le date iniziali come stringhe come queste:
date1 = "31/12/2015"
date2 = "01/01/2016"

Puoi fare quanto segue:
newdate1 = time.strptime(date1, "%d/%m/%Y")e newdate2 = time.strptime(date2, "%d/%m/%Y")convertirli nel formato data di Python. Quindi, il confronto è ovvio:

newdate1 > newdate2tornerà False
newdate1 < newdate2torneràTrue


40

datetime.date(2011, 1, 1) < datetime.date(2011, 1, 2)tornerà True.

datetime.date(2011, 1, 1) - datetime.date(2011, 1, 2)tornerà datetime.timedelta(-1).

datetime.date(2011, 1, 1) + datetime.date(2011, 1, 2)tornerà datetime.timedelta(1).

vedi i documenti .


3

Altre risposte usando datetimee confronti funzionano anche solo per un tempo, senza una data.

Ad esempio, per verificare se in questo momento sono più o meno le 8:00, possiamo usare:

import datetime

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

E successivamente confrontare con:

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

che tornerà True


-1

Per calcolare i giorni in una differenza di due date, puoi fare come di seguito:

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

Perché se un secondo è più con la data di scadenza, allora dobbiamo caricare


Non risponde alla domanda
Willwsharp,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.