Python Datetime : Guide Complet des Dates et Heures en Python
Updated on
Travailler avec les dates et les heures en Python devrait être simple, mais c'est rarement le cas. Vous devez analyser une chaîne de date provenant d'un fichier CSV, mais "01/02/2026" pourrait signifier le 2 janvier ou le 1er février selon la locale. Vous voulez calculer la différence entre deux horodatages, mais l'un est une chaîne et l'autre une époque Unix. Vous confondez strftime et strptime pour la dixième fois ce mois-ci. Les opérations de date et heure sont une source constante de bugs, d'erreurs de décalage et de maux de tête liés aux fuseaux horaires dans le code de production.
Les conséquences vont au-delà du simple désagrément. Un mauvais format de date dans un rapport financier signifie des calculs incorrects. Une comparaison naive de datetime qui ignore les fuseaux horaires provoque des tâches cron en double. Un calcul erroné de timedelta facture un client pour 31 jours au lieu de 30.
Le module intégré datetime de Python résout ces problèmes avec une API propre et cohérente. Il fournit des classes pour les dates, les heures, les horodatages et les durées. Une fois que vous maîtrisez ses modèles -- et en particulier la différence entre strftime et strptime -- vous pouvez gérer toute opération de date sans bibliothèques tierces.
Obtenir la Date et l'Heure Actuelles
Le point de départ le plus courant est d'obtenir la date et l'heure actuelles. Le module datetime offre plusieurs façons de le faire.
from datetime import datetime, date
# Date et heure actuelles
now = datetime.now()
print(now) # 2026-02-10 14:30:45.123456
# Date actuelle uniquement
today = date.today()
print(today) # 2026-02-10
# datetime.today() est similaire à datetime.now() mais sans support de fuseau horaire
now_alt = datetime.today()
print(now_alt) # 2026-02-10 14:30:45.123456La différence entre datetime.now() et datetime.today() est subtile mais importante. datetime.now() accepte un paramètre optionnel tz pour les datetimes avec fuseau horaire. datetime.today() non. Pour la plupart du code, préférez datetime.now().
from datetime import datetime
from zoneinfo import ZoneInfo
# Heure actuelle avec fuseau horaire
utc_now = datetime.now(tz=ZoneInfo("UTC"))
print(utc_now) # 2026-02-10 14:30:45.123456+00:00
tokyo_now = datetime.now(tz=ZoneInfo("Asia/Tokyo"))
print(tokyo_now) # 2026-02-10 23:30:45.123456+09:00Créer des Objets Datetime
Vous pouvez créer des objets datetime à partir de composants individuels ou de données existantes.
from datetime import datetime, date, time
# À partir de l'année, mois, jour, heure, minute, seconde
dt = datetime(2026, 3, 15, 9, 30, 0)
print(dt) # 2026-03-15 09:30:00
# Date uniquement
d = date(2026, 12, 25)
print(d) # 2026-12-25
# Heure uniquement
t = time(14, 30, 0)
print(t) # 14:30:00
# Combiner date et heure
combined = datetime.combine(d, t)
print(combined) # 2026-12-25 14:30:00Vous pouvez également extraire des composants d'un datetime existant.
from datetime import datetime
dt = datetime(2026, 3, 15, 9, 30, 45)
print(dt.year) # 2026
print(dt.month) # 3
print(dt.day) # 15
print(dt.hour) # 9
print(dt.minute) # 30
print(dt.second) # 45
print(dt.weekday()) # 6 (Dimanche, Lundi=0)
print(dt.isoformat()) # 2026-03-15T09:30:45Formater les Dates avec strftime
strftime signifie "string format time" (formater une chaîne à partir du temps). Il convertit un objet datetime en une chaîne formatée. Vous passez une chaîne de format avec des directives qui sont remplacées par les composants de date.
from datetime import datetime
dt = datetime(2026, 3, 15, 9, 5, 7)
# Formats courants
print(dt.strftime("%Y-%m-%d")) # 2026-03-15
print(dt.strftime("%d/%m/%Y")) # 15/03/2026
print(dt.strftime("%B %d, %Y")) # March 15, 2026
print(dt.strftime("%Y-%m-%d %H:%M:%S")) # 2026-03-15 09:05:07
print(dt.strftime("%I:%M %p")) # 09:05 AM
print(dt.strftime("%A, %B %d, %Y")) # Sunday, March 15, 2026Un moyen mnémotechnique : strftime = string from time (datetime vers chaîne).
Référence des Codes de Format strftime
| Code | Signification | Exemple |
|---|---|---|
%Y | Année à 4 chiffres | 2026 |
%y | Année à 2 chiffres | 26 |
%m | Mois avec zéro initial | 03 |
%B | Nom complet du mois | March |
%b | Nom abrégé du mois | Mar |
%d | Jour du mois (avec zéro initial) | 15 |
%A | Nom complet du jour de la semaine | Sunday |
%a | Nom abrégé du jour de la semaine | Sun |
%H | Heure (24h, avec zéro initial) | 09 |
%I | Heure (12h, avec zéro initial) | 09 |
%M | Minute (avec zéro initial) | 05 |
%S | Seconde (avec zéro initial) | 07 |
%p | AM/PM | AM |
%f | Microseconde (avec zéro initial sur 6 chiffres) | 000000 |
%z | Décalage UTC (+HHMM ou -HHMM) | +0000 |
%Z | Nom du fuseau horaire | UTC |
%j | Jour de l'année (001-366) | 074 |
%% | Caractère littéral % | % |
Modèles de Format les Plus Utilisés
| Modèle | Chaîne de Format | Sortie |
|---|---|---|
| ISO 8601 | %Y-%m-%dT%H:%M:%S | 2026-03-15T09:05:07 |
| Date US | %m/%d/%Y | 03/15/2026 |
| Date européenne | %d/%m/%Y | 15/03/2026 |
| Date lisible | %B %d, %Y | March 15, 2026 |
| Horodatage de log | %Y-%m-%d %H:%M:%S | 2026-03-15 09:05:07 |
| Heure 12h | %I:%M:%S %p | 09:05:07 AM |
| Date compacte | %Y%m%d | 20260315 |
| Horodatage compatible fichier | %Y%m%d_%H%M%S | 20260315_090507 |
Analyser des Chaînes avec strptime
strptime signifie "string parse time" (analyser une chaîne en temps). C'est l'inverse de strftime -- il convertit une chaîne en un objet datetime. Vous fournissez la chaîne et le format qu'elle suit.
from datetime import datetime
# Analyser différents formats de chaînes de date
dt1 = datetime.strptime("2026-03-15", "%Y-%m-%d")
print(dt1) # 2026-03-15 00:00:00
dt2 = datetime.strptime("15/03/2026", "%d/%m/%Y")
print(dt2) # 2026-03-15 00:00:00
dt3 = datetime.strptime("March 15, 2026 09:30 AM", "%B %d, %Y %I:%M %p")
print(dt3) # 2026-03-15 09:30:00
dt4 = datetime.strptime("2026-03-15T09:30:00", "%Y-%m-%dT%H:%M:%S")
print(dt4) # 2026-03-15 09:30:00Retenez : strptime = string parse time (chaîne vers datetime).
Gérer les Erreurs d'Analyse
Si la chaîne ne correspond pas au format, Python lève une ValueError. Enveloppez toujours les appels strptime dans une gestion d'erreurs lors de l'analyse d'entrées utilisateur ou de données externes.
from datetime import datetime
def safe_parse_date(date_string, fmt="%Y-%m-%d"):
"""Parse a date string safely, returning None on failure."""
try:
return datetime.strptime(date_string, fmt)
except ValueError as e:
print(f"Could not parse '{date_string}': {e}")
return None
# Valid input
print(safe_parse_date("2026-03-15")) # 2026-03-15 00:00:00
# Invalid input
print(safe_parse_date("15-03-2026")) # Could not parse '15-03-2026': ...
print(safe_parse_date("not a date")) # Could not parse 'not a date': ...Analyser Plusieurs Formats
Quand vous recevez des dates dans des formats imprévisibles, essayez plusieurs modèles.
from datetime import datetime
def parse_flexible_date(date_string):
"""Try multiple date formats and return the first match."""
formats = [
"%Y-%m-%d",
"%d/%m/%Y",
"%m/%d/%Y",
"%B %d, %Y",
"%b %d, %Y",
"%Y-%m-%dT%H:%M:%S",
"%Y-%m-%d %H:%M:%S",
]
for fmt in formats:
try:
return datetime.strptime(date_string, fmt)
except ValueError:
continue
raise ValueError(f"No matching format found for '{date_string}'")
print(parse_flexible_date("2026-03-15")) # 2026-03-15 00:00:00
print(parse_flexible_date("March 15, 2026")) # 2026-03-15 00:00:00
print(parse_flexible_date("15/03/2026")) # 2026-03-15 00:00:00Arithmétique des Dates avec timedelta
La classe timedelta représente une durée -- la différence entre deux dates ou heures. Vous pouvez ajouter ou soustraire des objets timedelta pour décaler des dates vers l'avant ou l'arrière.
from datetime import datetime, timedelta
now = datetime(2026, 2, 10, 12, 0, 0)
# Ajouter des jours
tomorrow = now + timedelta(days=1)
print(tomorrow) # 2026-02-11 12:00:00
# Soustraire des jours
last_week = now - timedelta(weeks=1)
print(last_week) # 2026-02-03 12:00:00
# Ajouter des heures et des minutes
later = now + timedelta(hours=5, minutes=30)
print(later) # 2026-02-10 17:30:00
# Combiner plusieurs unités
future = now + timedelta(weeks=2, days=3, hours=6)
print(future) # 2026-02-27 18:00:00Calculer des Différences de Temps
Soustraire un datetime d'un autre renvoie un timedelta.
from datetime import datetime
start = datetime(2026, 1, 1)
end = datetime(2026, 12, 31)
diff = end - start
print(diff) # 364 days, 0:00:00
print(diff.days) # 364
print(diff.total_seconds()) # 31449600.0Paramètres du Constructeur timedelta
| Paramètre | Description | Exemple |
|---|---|---|
weeks | Nombre de semaines | timedelta(weeks=2) = 14 jours |
days | Nombre de jours | timedelta(days=30) |
hours | Nombre d'heures | timedelta(hours=12) |
minutes | Nombre de minutes | timedelta(minutes=45) |
seconds | Nombre de secondes | timedelta(seconds=120) |
milliseconds | Nombre de millisecondes | timedelta(milliseconds=500) |
microseconds | Nombre de microsecondes | timedelta(microseconds=1000) |
Tous les paramètres peuvent être combinés. En interne, timedelta ne stocke que days, seconds et microseconds. Tout le reste est converti.
from datetime import timedelta
delta = timedelta(weeks=1, days=2, hours=3, minutes=30, seconds=45)
print(delta) # 9 days, 3:30:45
print(delta.days) # 9
print(delta.seconds) # 12645 (3*3600 + 30*60 + 45)
print(delta.total_seconds()) # 790245.0Comparer des Dates
Les objets datetime supportent tous les opérateurs de comparaison standard. Cela rend le tri et le filtrage des dates simples.
from datetime import datetime
dt1 = datetime(2026, 1, 1)
dt2 = datetime(2026, 6, 15)
dt3 = datetime(2026, 12, 31)
print(dt1 < dt2) # True
print(dt3 > dt2) # True
print(dt1 == dt2) # False
print(dt1 != dt2) # TrueTrier des Dates
from datetime import datetime
dates = [
datetime(2026, 12, 25),
datetime(2026, 1, 1),
datetime(2026, 7, 4),
datetime(2026, 2, 14),
]
sorted_dates = sorted(dates)
for d in sorted_dates:
print(d.strftime("%B %d, %Y"))
# January 01, 2026
# February 14, 2026
# July 04, 2026
# December 25, 2026Travailler avec les Horodatages
Les horodatages Unix représentent les secondes depuis le 1er janvier 1970 (l'époque Unix). Le module datetime peut convertir entre les horodatages et les objets datetime.
from datetime import datetime, timezone
# Datetime vers horodatage
dt = datetime(2026, 3, 15, 9, 30, 0)
ts = dt.timestamp()
print(ts) # 1773814200.0 (dépend du fuseau horaire local)
# Horodatage vers datetime (avec fuseau horaire, recommandé)
dt_aware = datetime.fromtimestamp(ts, tz=timezone.utc)
print(dt_aware) # 2026-03-15 01:30:00+00:00Important : datetime.fromtimestamp() sans fuseau horaire renvoie l'heure locale. Pour UTC, passez toujours tz=timezone.utc.
Gestion des Fuseaux Horaires
Les datetimes naïfs (sans information de fuseau horaire) sont une source courante de bugs. Python fournit deux approches intégrées pour les datetimes avec fuseau horaire.
Utiliser datetime.timezone (Intégré)
La classe timezone gère les décalages UTC fixes.
from datetime import datetime, timezone, timedelta
# UTC
utc_now = datetime.now(timezone.utc)
print(utc_now) # 2026-02-10 14:30:00+00:00
# Décalage fixe (ex : UTC+5:30 pour l'Inde)
ist = timezone(timedelta(hours=5, minutes=30))
india_time = datetime.now(ist)
print(india_time) # 2026-02-10 20:00:00+05:30
# Convertir entre fuseaux horaires
utc_time = datetime(2026, 3, 15, 12, 0, 0, tzinfo=timezone.utc)
eastern = timezone(timedelta(hours=-5))
eastern_time = utc_time.astimezone(eastern)
print(eastern_time) # 2026-03-15 07:00:00-05:00Utiliser zoneinfo (Python 3.9+)
Pour les fuseaux horaires nommés avec gestion correcte de l'heure d'été, utilisez le module zoneinfo.
from datetime import datetime
from zoneinfo import ZoneInfo
# Fuseaux horaires nommés
utc = ZoneInfo("UTC")
eastern = ZoneInfo("America/New_York")
tokyo = ZoneInfo("Asia/Tokyo")
# Créer un datetime avec fuseau horaire
dt = datetime(2026, 7, 15, 12, 0, 0, tzinfo=utc)
print(dt) # 2026-07-15 12:00:00+00:00
# Convertir vers d'autres fuseaux horaires
print(dt.astimezone(eastern)) # 2026-07-15 08:00:00-04:00 (EDT)
print(dt.astimezone(tokyo)) # 2026-07-15 21:00:00+09:00Datetimes Naïfs vs Conscients
| Caractéristique | Naïf | Conscient |
|---|---|---|
| A des informations de fuseau horaire | Non | Oui |
| Sûr pour les comparaisons entre zones | Non | Oui |
Créé par datetime.now() | Oui | Non (sauf si tz est passé) |
| Peut être mélangé en arithmétique | Seulement avec d'autres naïfs | Seulement avec d'autres conscients |
| Recommandé pour la production | Non | Oui |
Vous ne pouvez pas comparer ou soustraire un datetime naïf d'un datetime conscient. Python lève un TypeError.
Exemples Pratiques
Calculer l'Âge d'une Personne
from datetime import date
def calculate_age(birth_date):
"""Calculate age in years from a birth date."""
today = date.today()
age = today.year - birth_date.year
if (today.month, today.day) < (birth_date.month, birth_date.day):
age -= 1
return age
birthday = date(1995, 8, 20)
print(f"Age: {calculate_age(birthday)} years") # Age: 30 years (as of Feb 2026)Générer une Plage de Dates
from datetime import date, timedelta
def date_range(start, end, step_days=1):
"""Generate dates from start to end (inclusive)."""
current = start
while current <= end:
yield current
current += timedelta(days=step_days)
start = date(2026, 2, 1)
end = date(2026, 2, 7)
for d in date_range(start, end):
print(d.strftime("%A, %B %d"))Compter les Jours Ouvrés Entre Deux Dates
from datetime import date, timedelta
def business_days_between(start, end):
"""Count weekdays (Mon-Fri) between two dates, excluding endpoints."""
count = 0
current = start + timedelta(days=1)
while current < end:
if current.weekday() < 5: # 0=Mon, 4=Fri
count += 1
current += timedelta(days=1)
return count
start = date(2026, 2, 1)
end = date(2026, 2, 28)
print(f"Business days: {business_days_between(start, end)}") # Business days: 19Expérimenter avec Datetime dans Jupyter
Les opérations de date et heure bénéficient de l'expérimentation interactive. Quand vous analysez des formats de date incohérents d'un CSV ou que vous déboguez des conversions de fuseaux horaires, pouvoir tester chaque étape dans une cellule de notebook fait gagner un temps considérable.
RunCell (opens in a new tab) est un agent IA qui travaille directement dans les notebooks Jupyter. Il peut inspecter vos objets datetime, suggérer les bons codes de format strftime/strptime pour vos données et aider à déboguer les problèmes de conversion de fuseaux horaires en temps réel.
strftime vs strptime : Comparaison Rapide
| strftime | strptime | |
|---|---|---|
| Nom complet | String Format Time | String Parse Time |
| Direction | datetime -> chaîne | chaîne -> datetime |
| Appelé sur | Un objet datetime | La classe datetime |
| Syntaxe | dt.strftime("%Y-%m-%d") | datetime.strptime(s, "%Y-%m-%d") |
| Retourne | Une chaîne formatée | Un objet datetime |
| Lève | Jamais | ValueError si le format ne correspond pas |
| Cas d'usage | Affichage, logging, noms de fichiers | Analyse de CSV, réponses API, entrées utilisateur |
from datetime import datetime
# strftime: datetime -> string
dt = datetime(2026, 3, 15, 9, 30)
formatted = dt.strftime("%B %d, %Y at %I:%M %p")
print(formatted) # March 15, 2026 at 09:30 AM
# strptime: string -> datetime
parsed = datetime.strptime("March 15, 2026 at 09:30 AM", "%B %d, %Y at %I:%M %p")
print(parsed) # 2026-03-15 09:30:00FAQ
Comment obtenir la date et l'heure actuelles en Python ?
Utilisez datetime.now() du module datetime. Pour juste la date, utilisez date.today(). Pour l'heure actuelle avec fuseau horaire, passez un fuseau : datetime.now(tz=timezone.utc). Ce sont les approches standard qui ne nécessitent pas de bibliothèques tierces.
Quelle est la différence entre strftime et strptime en Python ?
strftime convertit un objet datetime en une chaîne formatée (chaîne à partir du temps). strptime analyse une chaîne et la convertit en un objet datetime (analyser une chaîne en temps). Retenez : strftime produit des chaînes, strptime consomme des chaînes. Les deux utilisent les mêmes codes de format comme %Y, %m, %d.
Comment ajouter des jours à une date en Python ?
Utilisez la classe timedelta. Importez-la depuis datetime, puis ajoutez-la à votre date : new_date = old_date + timedelta(days=7). Vous pouvez aussi utiliser weeks, hours, minutes et seconds comme paramètres. La soustraction fonctionne de la même façon : past_date = today - timedelta(days=30).
Comment convertir une chaîne en datetime en Python ?
Utilisez datetime.strptime(string, format). Vous devez fournir une chaîne de format qui correspond à votre entrée. Par exemple, datetime.strptime("2026-03-15", "%Y-%m-%d") analyse une date ISO. Si la chaîne ne correspond pas au format, Python lève une ValueError, donc enveloppez l'appel dans un bloc try/except pour les données externes.
Comment gérer les fuseaux horaires avec Python datetime ?
Pour Python 3.9+, utilisez le module intégré zoneinfo : from zoneinfo import ZoneInfo. Créez des datetimes avec fuseau horaire avec datetime.now(tz=ZoneInfo("UTC")) et convertissez entre les zones avec dt.astimezone(ZoneInfo("America/New_York")). Pour les décalages UTC fixes, utilisez datetime.timezone(timedelta(hours=N)). Évitez les datetimes naïfs dans le code de production.
Conclusion
Le module datetime de Python fournit tout ce dont vous avez besoin pour les opérations de date et heure : créer des dates, les formater pour l'affichage, les analyser à partir de chaînes, effectuer de l'arithmétique et gérer les fuseaux horaires. Les modèles clés sont cohérents et prévisibles une fois appris.
Retenez la distinction fondamentale : strftime formate un datetime en chaîne, strptime analyse une chaîne en datetime. Utilisez timedelta pour l'arithmétique des dates. Utilisez zoneinfo (Python 3.9+) pour une gestion correcte des fuseaux horaires. Gardez les datetimes avec fuseau horaire dans le code de production pour éviter les bugs subtils de comparaison.
Pour la plupart des projets, le module intégré datetime suffit. Vous n'avez pas besoin de pytz en Python moderne -- zoneinfo gère nativement les fuseaux horaires nommés. Commencez avec datetime.now(tz=timezone.utc) comme point de référence et ne convertissez en fuseaux horaires locaux que pour l'affichage aux utilisateurs.