Apprenez en lisant dans l'ordre

datetime et time — Travailler avec dates, heures et temps écoulé

Apprends les modules datetime / time / calendar de Python depuis la base. Couvre l'arithmétique de dates avec date / datetime / timedelta, la conversion de chaînes via strftime / strptime, et la mesure du temps écoulé avec time.perf_counter — le tout en pratique.

Cet article parcourt les trois bibliothèques standard qui gèrent les dates, heures et temps écoulédatetime / time / calendar. Tu verras l'arithmétique de dates avec date / datetime / timedelta, la conversion bidirectionnelle de chaînes avec strftime / strptime, et la mesure du temps écoulé avec time.perf_counter.

date / datetime / timedelta — Créer des dates et calculer des différences

Quand tu travailles avec des dates en Python, tu choisis parmi trois classes dans le module datetime. date ne contient que année/mois/jour, datetime ajoute heure/minute/seconde, et timedelta représente une durée comme « 3 jours » ou « 2 heures ». Le design est symétrique : date + timedelta te donne « dans 3 jours », et date - date retourne l'écart entre deux dates sous forme de timedelta.

Comment date / datetime / timedelta sont liés
dateannée / mois / jourdatetimeannée / mois / jour + heuretimedeltadurée (écart / décalage)
date et datetime représentent des points dans le temps ; timedelta représente l'écart entre eux ou un montant à ajouter.
ClasseCe qu'elle stockeUsage typique
dateannée / mois / jourDates de naissance, dates de commande — tout ce où seule la date compte
datetimeannée / mois / jour + heure / minute / secondeLogs, dates de modification de fichier — tout ce où l'heure compte aussi
timedeltajours / secondes / microsecondes« dans 3 jours », « temps écoulé » — durées
timeheure / minute / seconde (pas de date)Heure du jour seulement, par exemple « heures d'ouverture 9:00 à 18:00 »
Faire de l'arithmétique de date avec la bibliothèque datetime
date(2024, 3, 15)créer+ timedelta(days=3)date(2024, 3, 18)résultat+ timedelta= nouvelle date
date + timedelta te donne une nouvelle date. La différence date2 - date1 retourne un timedelta.
from datetime import date, datetime, timedelta

# Créer une date
order_date = date(2024, 3, 15)
print(order_date)            # 2024-03-15

# Trois jours plus tard
delivery = order_date + timedelta(days=3)
print(delivery)              # 2024-03-18

# L'écart entre deux dates est un timedelta
elapsed = delivery - order_date
print(elapsed.days)          # 3

# Heure actuelle
now = datetime.now()
print(now.year, now.month, now.day)

datetime.now et la dépendance à l'environnement

datetime.now() retourne l'heure actuelle de la machine qui exécute le code, donc la valeur change à chaque exécution que tu sois sur le runtime Pyodide du navigateur ou une vraie machine. Les exercices pratiques utilisent une date(2024, 3, 15) fixe pour rester reproductibles — essaie now() séparément dans la console pour voir comment ça se comporte.

Calcule la date d'expédition (3 jours plus tard) et la date d'échéance de paiement (14 jours plus tard) à partir de la date de commande 2024-03-15.

① Importe date et timedelta depuis datetime, puis construis la date de commande date(2024, 3, 15).

② Calcule date d'expédition = date de commande + timedelta(days=3) et échéance = date de commande + timedelta(days=14).

③ Affiche les deux sous la forme Ship date: ... et Pay due: ....

Éditeur Python

Exécuter le code pour voir le résultat

Calculer l'écart entre deux dates

Soustraire une date d'une autre retourne un objet timedelta. L'attribut .days te donne juste le nombre de jours, donc des questions comme « combien de jours jusqu'à X ? » ont une réponse entière propre.

Calcule combien de jours séparent la date d'expédition et l'échéance de la Pratique 1.

① Recrée les mêmes date de commande, date d'expédition et date d'échéance qu'à la Pratique 1.

② Calcule pay_due - ship_date pour obtenir un timedelta, puis lis son attribut .days.

③ Affiche le nombre de jours sous la forme Interval: ... days.

Éditeur Python

Exécuter le code pour voir le résultat

strftime / strptime — Convertir entre dates et chaînes

Les dates dans les fichiers, logs ou JSON arrivent presque toujours sous forme de chaînes. En Python, strftime (format time) transforme datetime → chaîne, et strptime (parse time) transforme chaîne → datetime. Les deux prennent un code de format qui mappe symboles à significations — %Y est une année à 4 chiffres, %m un mois à 2 chiffres, et ainsi de suite.

La symétrie de strftime et strptime
objetdatetimechaîne'2024-03-15'codes de format comme%Y-%m-%dobjetdatetimechaîne'2024-03-15'strftime (format)strptime (parse)
strftime écrit un datetime en sortie en utilisant une chaîne de format ; strptime lit une chaîne en entrée avec le même format. Le f est pour format, le p est pour parse. Les codes de format (%Y, %m, %d, etc.) sont partagés entre les deux.
Code de formatSignificationExemple
%YAnnée à 4 chiffres2024
%mMois à 2 chiffres (01-12)03
%dJour à 2 chiffres (01-31)15
%HHeure 24h à 2 chiffres (00-23)14
%MMinute à 2 chiffres (00-59)30
%SSeconde à 2 chiffres (00-59)00
%ANom du jour de la semaine (anglais)Friday
%wNuméro du jour de la semaine (0=dim, 6=sam)5
from datetime import datetime

# chaîne -> datetime
text = "2024-03-15 14:30:00"
dt = datetime.strptime(text, "%Y-%m-%d %H:%M:%S")
print(dt.year, dt.month, dt.day)   # 2024 3 15

# datetime -> chaîne
dt2 = datetime(2024, 3, 15, 14, 30)
print(dt2.strftime("%Y/%m/%d"))               # 2024/03/15
print(dt2.strftime("%Y-%m-%d %H:%M"))          # 2024-03-15 14:30

Les non-correspondances de format lèvent ValueError

Si les séparateurs dans ta chaîne ne correspondent pas au code de format — par exemple strptime("2024/03/15", "%Y-%m-%d") — tu obtiens une ValueError. Regarde le format réel de tes données d'entrée et aligne tirets avec tirets, slashs avec slashs. Pour les chaînes de style ISO comme "2024-03-15T14:30:00" qui mélangent tirets avec un T et deux-points, datetime.fromisoformat(text) est plus facile.

Convertis la chaîne d'horodatage de log « 2024-03-15 14:30:45 » en un objet datetime, puis reformate-le différemment.

① Importe la classe datetime depuis le module datetime.

② Stocke la chaîne d'horodatage ci-dessus dans une variable.

Analyse la chaîne en un objet datetime (le code de format reflète la disposition de l'entrée). Puis affiche Type: datetime en utilisant type(value).__name__.

④ Extrais année, mois et jour du datetime comme attributs (d.year / d.month / d.day) et affiche-les sous la forme Year: ... Month: ... Day: ....

⑤ Formate le même datetime en année/mois/jour heure:minute (laisse tomber les secondes). Affiche le type de la valeur formatée sous la forme Formatted type: str avec type(formatted).__name__, puis affiche la valeur sous la forme Formatted: ... (confirmant qu'on est passé de datetime → str).

Éditeur Python

Exécuter le code pour voir le résultat

time et calendar — Mesurer le temps écoulé et inspecter les mois

Le module time est séparé de datetime et expose des API de temps de plus bas niveau. Celle que tu utiliseras le plus est time.perf_counter(), un compteur haute résolution qui retourne le temps écoulé courant en secondes (sous forme de float). Appelle-le deux fois — avant et après — et la différence est ton temps d'exécution. Le module calendar extrait des informations de calendrier comme combien de jours a un mois ou le jour de la semaine du premier du mois.

Quand utiliser time.time vs time.perf_counter
time.time()Timestamp Unix (secondes)time.perf_counter()compteur monotonehorodatages de logquand le temps absolu comptemesure d'exécutionquand le temps relatif suffit
time.time retourne les secondes depuis 1970-01-01 00:00 UTC (un timestamp Unix). time.perf_counter est un compteur monotone haute précision avec un zéro non spécifié — parfait pour mesurer le temps écoulé.
FonctionRetourneCas d'usage
time.time()Timestamp Unix (float)Horodatages de l'heure courante
time.perf_counter()compteur monotone (float, secondes)Mesurer le temps d'exécution
calendar.monthrange(y, m)tuple (jour de la semaine du 1er, dernier jour)Informations de calendrier mensuel
calendar.isleap(y)True / FalseVérification d'année bissextile
import time
import calendar

# Mesurer le temps d'exécution
start = time.perf_counter()
total = sum(range(100000))
elapsed = time.perf_counter() - start
print("Total:", total)
print("Type:", type(elapsed).__name__)   # float

# Infos calendrier
weekday, last_day = calendar.monthrange(2024, 2)   # (jour de la semaine du 1er, dernier jour)
print("Last day of Feb 2024:", last_day)
print("Leap year:", calendar.isleap(2024))

Pourquoi utiliser perf_counter au lieu de time.time

time.time() retourne un timestamp Unix (secondes avec une fraction), mais si l'horloge de la machine est ajustée en arrière par NTP, la différence peut devenir négative. time.perf_counter() est garanti monotone (toujours croissant) et est conçu pour la mesure du temps écoulé, donc pour un chronométrage de style chronomètre c'est le bon choix à chaque fois.

Combine la mesure du temps écoulé avec les infos de mois.

① Importe time et calendar.

② Démarre un chronomètre (utilise le compteur haute précision pour le temps écoulé).

③ Somme les entiers de 0 à 49999.

④ Calcule le temps écoulé et affiche Total: ... et Elapsed >= 0 seconds: True (le temps mural réel varie selon l'environnement, donc on confirme juste qu'il est non négatif).

⑤ Affiche le dernier jour de février 2024 sous la forme Feb end: ... days et la vérification d'année bissextile sous la forme Leap year: True / False.

Éditeur Python

Exécuter le code pour voir le résultat

time.sleep — Faire une pause pendant un intervalle défini

`time.sleep(seconds)` est une fonction qui met l'exécution en pause pendant le nombre de secondes donné. Elle apparaît partout — intervalles de retry, limitation de débit, timing d'animation. L'argument est un float, donc tu peux passer des fractions comme time.sleep(0.5). Comme ces exercices tournent dans le navigateur, garde les sleeps courts (0–1 seconde) pour vérifier le comportement.

Arrête l'exécution avec `time.sleep` et vérifie si le temps écoulé est d'au moins 0,3 seconde. Le temps mural réel oscille un peu selon l'environnement, donc on le vérifie comme un booléen — était-ce au moins 0,3 seconde ?

① Importe time.

② Enregistre le temps de départ avec time.perf_counter().

③ Attends 0,3 seconde avec time.sleep(0.3).

④ Calcule le temps écoulé comme time.perf_counter() - start_time et affiche Elapsed >= 0.2 seconds: True / False en utilisant >= 0.2.

(Si tu l'exécutes correctement l'explication apparaît en dessous.)

Éditeur Python

Exécuter le code pour voir le résultat
QUIZ

Vérification des connaissances

Répondez à chaque question une par une.

Question 1Quelle combinaison calcule « dans 3 jours » ?

Question 2Quelle chaîne de format convertit la chaîne "2024/03/15" en datetime ?

Question 3Lequel est le mieux pour mesurer le temps d'exécution ?

Question 4Quelle est la façon la plus simple de transformer la chaîne ISO 8601 "2024-03-15T14:30:00" en datetime ?