Question 1Quelle combinaison calcule « dans 3 jours » ?
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.
| Classe | Ce qu'elle stocke | Usage typique |
|---|---|---|
| date | année / mois / jour | Dates de naissance, dates de commande — tout ce où seule la date compte |
| datetime | année / mois / jour + heure / minute / seconde | Logs, dates de modification de fichier — tout ce où l'heure compte aussi |
| timedelta | jours / secondes / microsecondes | « dans 3 jours », « temps écoulé » — durées |
| time | heure / minute / seconde (pas de date) | Heure du jour seulement, par exemple « heures d'ouverture 9:00 à 18:00 » |
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.
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.
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.
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 format | Signification | Exemple |
|---|---|---|
| %Y | Année à 4 chiffres | 2024 |
| %m | Mois à 2 chiffres (01-12) | 03 |
| %d | Jour à 2 chiffres (01-31) | 15 |
| %H | Heure 24h à 2 chiffres (00-23) | 14 |
| %M | Minute à 2 chiffres (00-59) | 30 |
| %S | Seconde à 2 chiffres (00-59) | 00 |
| %A | Nom du jour de la semaine (anglais) | Friday |
| %w | Numé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.
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.
| Fonction | Retourne | Cas 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 / False | Vé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.
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.
Vérification des connaissances
Répondez à chaque question une par une.
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 ?