HOWTO · Python

Come sottrarre oggetti datetime in Python

Scopri come sottrarre oggetti datetime in Python e convertire la durata risultante in secondi, minuti o ore.

In questa pagina

Per sottrarre un oggetto datetime da un altro, usa later - earlier. Python restituisce un timedelta, che rappresenta la durata trascorsa tra i due valori. Puoi leggerla in giorni e secondi oppure convertirla in secondi, minuti o ore totali.

Usa il modulo datetime per sottrarre due valori datetime in Python

Il modulo datetime fornisce oggetti per date e orari. Crea ogni valore indicando anno, mese e giorno; ore, minuti, secondi e microsecondi sono facoltativi. L’esempio seguente usa valori fissi, quindi il risultato non dipende dal momento in cui lo esegui.

from datetime import datetime

earlier = datetime(2024, 5, 1, 9, 0)
later = datetime(2024, 5, 1, 11, 30)
duration = later - earlier

print(duration)
print(duration.total_seconds())
print(duration.total_seconds() / 60)
print(duration.total_seconds() / 3600)
2:30:00
9000.0
150.0
2.5

Il risultato è un timedelta di due ore e trenta minuti. Gli attributi days, seconds e microseconds descrivono la durata in componenti normalizzate. Per ottenere il totale dei secondi trascorsi, chiama total_seconds() sul timedelta (non su un oggetto datetime). Dividi quel valore per 60 per ottenere i minuti oppure per 3.600 per ottenere le ore. Se la durata non corrisponde a un numero intero di minuti o ore, queste divisioni mantengono le frazioni.

L’attributo days indica la componente in giorni interi, mentre seconds indica i secondi rimanenti nella durata normalizzata; nessuno dei due equivale al totale dei secondi. Per esempio, una durata superiore a un giorno può avere seconds inferiore a 86.400: usa quindi total_seconds() quando ti serve un unico conteggio per l’intero intervallo. Se sono presenti microsecondi, il valore restituito può essere un numero in virgola mobile.

Se ti servono unità intere, scegli esplicitamente una regola di arrotondamento. La conversione con int() tronca verso zero: non arrotonda all’unità più vicina. Inoltre, un anno non ha una durata fissa: considerare un anno pari a 365 giorni è solo un’approssimazione, perché gli anni bisestili e i confini dei mesi modificano i calcoli di calendario. Se la domanda riguarda date come «un anno dopo», usa un’interpretazione basata sul calendario invece dei secondi trascorsi.

La sottrazione è appropriata quando i due valori possono essere confrontati in modo coerente. I valori naive (senza informazioni sul fuso orario) possono essere sottratti tra loro. Per i valori aware, normalizzali entrambi in UTC con astimezone(timezone.utc) quando ti serve la durata trascorsa attraverso transizioni di fuso orario. Mescolare un valore naive e uno aware genera TypeError; assegna o converti deliberatamente le informazioni sul fuso orario prima della sottrazione.