HOWTO · Python

Confronta due date in Python

Questo tutorial mostra come confrontare due date e controllare quale data è maggiore in Python.

In questa pagina

Per confrontare due valori in Python, usa gli operatori di confronto quando i tipi sono compatibili. Il confronto tra date ordina i giorni di calendario; quello tra datetime considera anche l’ora. Non è possibile ordinare direttamente un date e un datetime: confronta valori dello stesso tipo oppure converti intenzionalmente entrambi in una rappresentazione comune. Analizza le stringhe prima di confrontarle e sottrai valori di data e ora quando ti serve misurare un intervallo trascorso. In un sistema di prenotazioni, per esempio, puoi confrontare le date richieste e quelle prenotate per stabilirne l’ordine o individuare conflitti.

Confrontare oggetti date con gli operatori di confronto

Importa la classe date dal modulo datetime per confrontare date di calendario senza considerare l’ora. Gli operatori <, >, <=, >=, == e != confrontano anno, mese e giorno in ordine cronologico. Per esempio, il 29 giugno è successivo al 9 giugno; l’espressione booleana chiede a Python di verificare quest’ordine.

Esegui questo esempio:

Il codice e le etichette o gli output visibili in questa sezione restano in inglese.

from datetime import date

start = date(2023, 6, 9)
end = date(2023, 6, 29)
print(end > start)
True

L’esempio stampa True: il 29 giugno è successivo al 9 giugno. Usa date quando conta solo il giorno di calendario, per esempio per verificare se una scadenza è passata. Entrambi gli operandi dovrebbero essere valori date. Non confrontare direttamente in ordine un date con un datetime: per l’ordinamento Python richiede tipi di operando compatibili. Confronta valori dello stesso tipo oppure converti intenzionalmente entrambi in una rappresentazione comune. Una stringa come "2023-06-29" non viene convertita automaticamente durante il confronto.

Confrontare oggetti datetime quando conta anche l’ora

Usa la classe datetime quando l’ora del giorno deve influire sul risultato. Il confronto include i campi della data e dell’ora, quindi due valori dello stesso giorno di calendario possono comunque essere ordinati in base a ore, minuti e unità più piccole. I valori seguenti si riferiscono allo stesso giorno, ma le 16:30 sono successive alle 9:00.

Il codice e le etichette o gli output visibili in questa sezione restano in inglese.

from datetime import datetime

morning = datetime(2023, 6, 29, 9, 0)
afternoon = datetime(2023, 6, 29, 16, 30)
print(afternoon > morning)
True

L’esempio stampa True. I valori datetime senza informazioni sul fuso orario, detti naive, possono essere confrontati con altri valori naive. Per i valori consapevoli del fuso orario, usa informazioni compatibili. Python non consente di ordinare un datetime naive rispetto a uno consapevole: prima del confronto, normalizza i valori secondo una politica comune per i fusi orari. Scegli date se vuoi che orari diversi dello stesso giorno siano considerati uguali.

Analizzare stringhe di date con time.strptime()

Prima di confrontare date testuali, devi conoscerne il formato. La funzione time.strptime() analizza una stringa secondo un formato e restituisce un struct_time; le tuple così ottenute possono poi essere confrontate in ordine cronologico. Il formato seguente corrisponde a un input giorno/mese/anno: %d/%m/%Y interpreta 30/11/2020 come 30 novembre 2020.

Il codice e le etichette o gli output visibili in questa sezione restano in inglese.

import time

first_text = "30/11/2020"
second_text = "12/10/2019"
first_date = time.strptime(first_text, "%d/%m/%Y")
second_date = time.strptime(second_text, "%d/%m/%Y")
print(first_date > second_date)
True

L’esempio stampa True: in base ai campi anno, mese e giorno, la prima data analizzata è successiva alla seconda. Il formato deve corrispondere esattamente all’input: %m/%d/%Y indicherebbe un ordine diverso. Non confrontare direttamente stringhe di date per stabilirne l’ordine cronologico, perché l’ordine dei caratteri potrebbe non corrispondere a quello del calendario. Se l’input può variare o richiede la gestione dei fusi orari, analizzalo invece in una rappresentazione datetime appropriata.

Usare timedelta per confrontare intervalli tra date

Sottrarre un date da un altro, oppure un datetime da un altro compatibile, produce un timedelta. Si tratta di un intervallo trascorso, non di una data. Confrontalo con un altro timedelta quando vuoi sapere se è passato abbastanza tempo; usa gli operatori di confronto sulle date originali quando vuoi stabilire quale viene prima.

Il codice e le etichette o gli output visibili in questa sezione restano in inglese.

from datetime import date, timedelta

start = date(2023, 6, 9)
end = date(2023, 6, 29)
elapsed = end - start
print(elapsed > timedelta(days=7))
True

L’esempio stampa True. La sottrazione produce un intervallo di 20 giorni, superiore alla soglia di sette giorni. timedelta accetta unità come giorni, secondi, minuti, ore e settimane; rappresenta una durata e non tiene conto dei mesi o degli anni di calendario, la cui lunghezza varia. Per un intervallo tra valori datetime, assicurati che entrambi rispettino le stesse regole di consapevolezza del fuso orario e di gestione dei fusi prima di sottrarli.