
Le module standard datetime gère tout ce qui touche aux dates et aux heures en Python : créer une date, calculer une échéance, mesurer un écart, convertir une chaîne en date. Il fournit quatre classes clés : date (une date), time (une heure), datetime (les deux) et timedelta (une durée). Ce guide couvre l'obtention de la date actuelle, l'arithmétique avec timedelta, la conversion texte-date avec strptime, et la gestion des fuseaux horaires avec zoneinfo.
Il s'adresse aux développeurs qui horodatent des logs, calculent des échéances ou lisent des dates depuis un fichier. Un concept structure tout : une date peut être naïve (sans fuseau) ou consciente (avec fuseau). Pour le formatage détaillé d'une date en texte, voir le guide formatage de chaînes. Tous les exemples ont été exécutés avec Python 3.12.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Distinguer les classes
date,time,datetimeettimedelta. - Obtenir la date et l'heure actuelles proprement.
- Calculer des échéances et des écarts avec
timedelta. - Convertir une chaîne en date avec
strptime. - Gérer les fuseaux horaires avec
zoneinfoet UTC.
Les classes date, time et datetime
Section intitulée « Les classes date, time et datetime »Le module propose quatre classes complémentaires. On choisit selon ce que l'on manipule : un jour, un horaire, un instant complet ou une durée.
from datetime import date, time, datetime, timedelta
date(2026, 7, 2) # une date : 2026-07-02time(14, 30) # une heure : 14:30:00datetime(2026, 7, 2, 14, 30) # date + heure : 2026-07-02 14:30:00timedelta(days=7) # une durée : 7 joursUne fois un objet datetime créé, on accède à ses composants par des attributs :
dt = datetime(2026, 7, 2, 14, 30)print(dt.year, dt.month, dt.day) # 2026 7 2print(dt.hour, dt.minute) # 14 30Obtenir la date et l'heure actuelles
Section intitulée « Obtenir la date et l'heure actuelles »Pour l'instant présent, datetime.now() renvoie la date et l'heure locales, et date.today() la date seule.
from datetime import datetime, date, timezone
datetime.now() # 2026-07-02 14:30:12.345date.today() # 2026-07-02datetime.now(timezone.utc) # même instant, en UTCCalculer avec timedelta
Section intitulée « Calculer avec timedelta »Un timedelta représente une durée. On l'ajoute ou on le soustrait à une date pour obtenir une échéance.
from datetime import datetime, timedelta
maintenant = datetime.now()
dans_une_semaine = maintenant + timedelta(days=7)il_y_a_deux_heures = maintenant - timedelta(hours=2)echeance = maintenant + timedelta(days=1, hours=12) # combinableInversement, soustraire deux dates donne un timedelta, ce qui répond à la question « combien de temps entre A et B ? ».
from datetime import date
ecart = date(2026, 12, 25) - date(2026, 7, 2)print(ecart.days) # 176 → jours avant NoëlL'attribut .days donne le nombre de jours entiers, et .total_seconds() la durée totale en secondes, pratique pour convertir en heures ou minutes.
Convertir entre texte et date
Section intitulée « Convertir entre texte et date »Les dates arrivent souvent sous forme de texte (fichier, API, saisie). La méthode strptime (string parse time) lit une chaîne selon un format décrit par des codes.
from datetime import datetime
saisie = "02/07/2026 14:30"dt = datetime.strptime(saisie, "%d/%m/%Y %H:%M")print(dt) # 2026-07-02 14:30:00Les codes de format sont standards : %d jour, %m mois, %Y année (4 chiffres), %H heure, %M minute, %S seconde. L'opération inverse, produire du texte à partir d'un datetime, se fait avec strftime :
dt.strftime("%d/%m/%Y") # '02/07/2026'Gérer les fuseaux horaires
Section intitulée « Gérer les fuseaux horaires »Une date naïve ignore le fuseau ; une date consciente (aware) le connaît. Dès qu'un programme touche plusieurs régions, il faut des dates conscientes. Depuis Python 3.9, le module zoneinfo fournit les fuseaux, sans dépendance externe.
from datetime import datetime, timezonefrom zoneinfo import ZoneInfo
paris = datetime(2026, 7, 2, 14, 0, tzinfo=ZoneInfo("Europe/Paris"))print(paris) # 2026-07-02 14:00:00+02:00
en_utc = paris.astimezone(timezone.utc)print(en_utc) # 2026-07-02 12:00:00+00:00On attache un fuseau à la création avec tzinfo, puis astimezone convertit vers un autre fuseau. zoneinfo remplace l'ancienne bibliothèque tierce pytz.
Les timestamps Unix
Section intitulée « Les timestamps Unix »Un timestamp est le nombre de secondes écoulées depuis le 1er janvier 1970 (UTC). C'est le format d'échange le plus universel entre systèmes. On convertit dans les deux sens :
from datetime import datetime, timezone
dt = datetime(2026, 7, 2, tzinfo=timezone.utc)ts = dt.timestamp() # 1782950400.0datetime.fromtimestamp(ts, timezone.utc) # retour à un datetimeÀ retenir
Section intitulée « À retenir »- Le module
datetimefournitdate,time,datetimeettimedelta; on choisit selon le besoin. datetime.now()donne l'instant local ;datetime.now(timezone.utc)l'instant en UTC.datetime.utcnow()est déprécié (3.12) : préféreznow(timezone.utc).timedeltaexprime une durée : on l'ajoute à une date, et soustraire deux dates en renvoie une.strptimelit une chaîne en date,strftimefait l'inverse (codes%d,%m,%Y).- Depuis Python 3.9,
zoneinfogère les fuseaux sans dépendance (remplacepytz). - Règle d'or : stocker en UTC, convertir à l'affichage.
FAQ : les dates et heures en Python
Section intitulée « FAQ : les dates et heures en Python »datetime puis appelez now() :from datetime import datetime, date, timezone
datetime.now() # date et heure locales
date.today() # date seule
datetime.now(timezone.utc) # heure en UTC (recommandé pour stocker)
Pour une heure fiable, indépendante du fuseau, préférez datetime.now(timezone.utc). L'ancienne datetime.utcnow() est dépréciée depuis Python 3.12, car elle renvoyait une date sans fuseau, source d'erreurs.timedelta (une durée) qu'on ajoute ou soustrait :from datetime import datetime, timedelta
maintenant = datetime.now()
maintenant + timedelta(days=7) # dans une semaine
maintenant - timedelta(hours=2) # il y a 2 heures
timedelta accepte days, hours, minutes, seconds, weeks, combinables :timedelta(days=1, hours=12) # 1 jour et demi
timedelta :from datetime import date
ecart = date(2026, 12, 25) - date(2026, 7, 2)
print(ecart.days) # 176
.daysdonne le nombre de jours..total_seconds()donne la durée totale en secondes (utile pour des heures ou minutes).
datetime complets, avec la précision des secondes.strptime (string parse time) lit une chaîne selon un format :from datetime import datetime
dt = datetime.strptime("02/07/2026 14:30", "%d/%m/%Y %H:%M")
print(dt) # 2026-07-02 14:30:00
Les codes décrivent le format : %d jour, %m mois, %Y année, %H heure, %M minute.L'opération inverse (datetime vers texte) se fait avec strftime : dt.strftime("%d/%m/%Y").zoneinfo fournit les fuseaux, sans dépendance externe :from datetime import datetime, timezone
from zoneinfo import ZoneInfo
paris = datetime(2026, 7, 2, 14, 0, tzinfo=ZoneInfo("Europe/Paris"))
paris.astimezone(timezone.utc) # convertit en UTC
zoneinfo remplace l'ancienne bibliothèque pytz. Bonne pratique : stocker en UTC, convertir vers le fuseau local seulement à l'affichage.datetime fournit quatre classes complémentaires :| Classe | Représente | Exemple |
|---|---|---|
date |
une date seule | date(2026, 7, 2) |
time |
une heure seule | time(14, 30) |
datetime |
date et heure | datetime(2026, 7, 2, 14, 30) |
timedelta |
une durée | timedelta(days=7) |
date), un horaire (time), un instant complet (datetime) ou un écart (timedelta).Prochaines étapes
Section intitulée « Prochaines étapes »Les dates servent surtout à horodater, formater et journaliser. Voici les sujets liés.