Aller au contenu
Développement medium

Dates et heures en Python : datetime, timedelta, fuseaux

8 min de lecture

logo python

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.

  • Distinguer les classes date, time, datetime et timedelta.
  • 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 zoneinfo et UTC.

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-02
time(14, 30) # une heure : 14:30:00
datetime(2026, 7, 2, 14, 30) # date + heure : 2026-07-02 14:30:00
timedelta(days=7) # une durée : 7 jours

Une 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 2
print(dt.hour, dt.minute) # 14 30

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.345
date.today() # 2026-07-02
datetime.now(timezone.utc) # même instant, en UTC

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

Inversement, 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ël

L'attribut .days donne le nombre de jours entiers, et .total_seconds() la durée totale en secondes, pratique pour convertir en heures ou minutes.

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:00

Les 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'

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, timezone
from 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:00

On attache un fuseau à la création avec tzinfo, puis astimezone convertit vers un autre fuseau. zoneinfo remplace l'ancienne bibliothèque tierce pytz.

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.0
datetime.fromtimestamp(ts, timezone.utc) # retour à un datetime
  • Le module datetime fournit date, time, datetime et timedelta ; 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érez now(timezone.utc).
  • timedelta exprime une durée : on l'ajoute à une date, et soustraire deux dates en renvoie une.
  • strptime lit une chaîne en date, strftime fait l'inverse (codes %d, %m, %Y).
  • Depuis Python 3.9, zoneinfo gère les fuseaux sans dépendance (remplace pytz).
  • Règle d'or : stocker en UTC, convertir à l'affichage.

Les dates servent surtout à horodater, formater et journaliser. Voici les sujets liés.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn