Menu

datetime in Python: date, orari, timedelta e fusi orari

Un giro pratico nel modulo datetime di Python: interpretare, formattare, fare calcoli con le date e gestire i fusi orari senza perdersi.

Questa pagina include editor eseguibili: modifica, esegui e vedi subito l'output.

I due tipi fondamentali: date e datetime

Il modulo datetime ti offre quattro cose da conoscere: date, time, datetime e timedelta. I primi tre sono quello che sembrano; il quarto è un intervallo di tempo.

Un date rappresenta un giorno (anno, mese, giorno) senza orologio. Un datetime è una data più un orario. Se l'orario non ti serve, date è la scelta più ordinata.

Creare date specifiche

Costruiscile direttamente:

Gli argomenti sono year, month, day per date, e fino a year, month, day, hour, minute, second, microsecond per datetime.

Leggere i campi

Ogni date/datetime ha degli attributi:

isoformat() è il tuo alleato per un output leggibile dalle macchine: produce qualcosa come "2026-04-20T09:30:15", che altri sistemi possono interpretare senza ambiguità.

Formattare con strftime

Per un output leggibile dalle persone, .strftime(fmt) trasforma un date o un datetime in una stringa formattata:

I codici di formato che conviene ricordare più spesso:

  • %Y: anno a 4 cifre (2026)
  • %m: numero del mese, con zero iniziale (04)
  • %d: giorno del mese, con zero iniziale (20)
  • %H / %I: ora, formato 24 o 12 ore
  • %M: minuti
  • %S: secondi
  • %A / %a: nome del giorno completo o abbreviato (Monday / Mon)
  • %B / %b: nome del mese completo o abbreviato (April / Apr)
  • %p: AM/PM

Non serve impararli a memoria; salva un riferimento tra i preferiti e consultalo quando ti serve.

Interpretare con strptime

La direzione opposta: prendere una stringa di forma nota e trasformarla in un datetime:

La stringa di formato deve corrispondere esattamente all'input. Se non corrisponde, strptime solleva ValueError.

Per le stringhe ISO-8601 (lo standard leggibile dalle macchine), nel Python moderno c'è una scorciatoia più semplice:

Se hai a che fare con formati casuali, il pacchetto esterno dateutil (pip install python-dateutil) ha un parser.parse() tollerante che prova a indovinare in modo ragionevole.

Calcoli con timedelta

Per fare calcoli con le date, usa timedelta per la differenza o lo spostamento:

Argomenti di timedelta: days, seconds, microseconds, milliseconds, minutes, hours, weeks. Niente months né years: i mesi hanno lunghezza variabile. Per i calcoli con mesi e anni, usa dateutil.relativedelta:

from dateutil.relativedelta import relativedelta
from datetime import date

today = date.today()
next_quarter = today + relativedelta(months=3)
print(next_quarter)

Fusi orari: naive e aware

Un datetime senza informazioni sul fuso orario è naive: Python non sa quale fuso rappresenti. I calcoli con datetime naive vanno bene finché resti in un unico fuso logico; i problemi iniziano appena si incontrano dati da fusi diversi.

Un datetime aware porta con sé le informazioni sul fuso. Aggiungi un fuso esplicitamente:

Python 3.9 ha aggiunto il modulo zoneinfo per i fusi orari con nome (usa il database IANA del sistema):

Converti da un fuso all'altro con .astimezone():

Una regola da tenere a mente: salva i datetime in UTC e converti nei fusi locali solo al momento di mostrarli. Questa sola abitudine previene la maggior parte dei bug legati ai fusi orari.

Timestamp

Un timestamp Unix è il numero di secondi trascorsi dal 1970-01-01 UTC. Python lo converte facilmente:

I timestamp sono utili per confronti, ordinamenti e per scambiare dati con altri sistemi. Per l'output destinato alle persone, riconvertili prima in datetime.

Misurare quanto dura qualcosa

Per misurazioni veloci, sottrai due datetime:

Per misure di prestazioni più serie, usa time.perf_counter(): ha una risoluzione inferiore al microsecondo e non risente dei cambi dell'orologio di sistema. datetime.now() va bene per numeri del tipo "quanto ci ha messo questa chiamata API".

Schemi che riutilizzerai

Cosa portarsi a casa

  • date, datetime e timedelta coprono il 90% delle necessità.
  • Usa ISO-8601 per l'output leggibile dalle macchine; strftime per quello leggibile dalle persone.
  • Salva in UTC; converti al momento di mostrare.
  • Usa zoneinfo per i fusi orari con nome.
  • Per mesi e anni, ricorri a dateutil.relativedelta.

Un altro strumento per la tua cassetta degli attrezzi: le espressioni regolari, subito dopo.

Domande frequenti

Come ottengo la data e l'ora correnti in Python?

datetime.now() restituisce la data e l'ora locali correnti. datetime.utcnow() restituisce l'ora UTC (anche se oggi si preferisce datetime.now(timezone.utc), perché utcnow() restituisce un datetime naive). Per la sola data, usa date.today().

Come formatto una data come stringa?

Usa .strftime(format) con codici di formato come %Y-%m-%d per anno-mese-giorno. Esempio: datetime.now().strftime('%Y-%m-%d %H:%M'). Per interpretare di nuovo una stringa, usa datetime.strptime(text, format) con gli stessi codici.

Come aggiungo giorni a una data in Python?

Usa timedelta: from datetime import date, timedelta; date.today() + timedelta(days=7). timedelta supporta giorni, ore, minuti, secondi, settimane e altro. Per i calcoli con mesi e anni usa il pacchetto esterno dateutil.relativedelta: timedelta non conosce i mesi.

Illustrazione dei linguaggi di programmazione di Coddy

Impara a programmare con Coddy

INIZIA