Pourquoi le module datetime est essentiel en NSI
Dans tes projets de NSI, que ce soit pour une application de gestion, un analyseur de logs ou un simulateur, tu auras très souvent besoin de manipuler des dates et des heures. Python, avec son module datetime intégré, te fournit tous les outils nécessaires pour cela. C'est un module puissant et relativement simple à prendre en main une fois que tu en as compris les concepts de base. Dans cet article, on va explorer ensemble comment créer des dates, les formater à ta guise, effectuer des calculs (comme trouver la différence entre deux dates) et même aborder la notion délicate des fuseaux horaires. Prêt à devenir un pro de la gestion du temps en Python ?
Les objets de base : date, time et datetime
Le module datetime définit plusieurs classes principales. Il est crucial de comprendre laquelle utiliser selon ton besoin.
La classe date
Elle ne gère que les dates (année, mois, jour), sans information sur l'heure. Parfait pour des anniversaires, des dates d'événements.
from datetime import date
aujourdhui = date.today() # Récupère la date du jour
print(aujourdhui) # Affiche : 2026-03-30
date_personnalisee = date(2024, 7, 26) # Crée le 26 juillet 2024
print(f"Année : {date_personnalisee.year}, Mois : {date_personnalisee.month}, Jour : {date_personnalisee.day}")
La classe time
À l'inverse, elle ne gère que l'heure (heures, minutes, secondes, microsecondes), indépendamment d'une date précise.
from datetime import time
midi = time(12, 0, 0)
print(midi) # 12:00:00
heure_precise = time(14, 30, 15, 500000) # 14h30, 15 secondes, 500000 microsecondes
print(heure_precise.second) # 15
La classe datetime (la plus complète)
C'est le combo gagnant : elle combine une date ET une heure. C'est celle que tu utiliseras le plus souvent.
from datetime import datetime
maintenant = datetime.now() # Date et heure actuelles
print(maintenant) # 2026-03-30 10:15:30.123456 (exemple)
evenement = datetime(2024, 12, 25, 20, 30) # 25 décembre 2024 à 20h30
print(evenement.hour) # 20
Formater et parser les dates : strftime et strptime
Par défaut, Python affiche les dates au format ISO (AAAA-MM-JJ). Mais dans la vraie vie, on a besoin d'afficher "Mercredi 25 Décembre 2024" ou de lire une date entrée par un utilisateur comme "25/12/2024". C'est là qu'interviennent strftime (date → texte) et strptime (texte → date).
strftime : de l'objet à la chaîne de caractères
Cette méthode permet de formater un objet date ou datetime en une chaîne de caractères lisible.
maintenant = datetime.now()
# Format classique français
print(maintenant.strftime("%d/%m/%Y %H:%M")) # 30/03/2026 10:15
# Format plus verbeux
print(maintenant.strftime("Nous sommes le %A %d %B %Y.")) # Nous sommes le lundi 30 mars 2026.
# Pour un nom de fichier
print(maintenant.strftime("log_%Y%m%d_%H%M.txt")) # log_20260330_1015.txt
Quelques codes de format utiles :
- %d : Jour du mois (01 à 31)
- %m : Mois (01 à 12)
- %Y : Année sur 4 chiffres (ex: 2024)
- %H : Heure (00 à 23)
- %M : Minute (00 à 59)
- %A : Nom complet du jour de la semaine (Lundi...)
- %B : Nom complet du mois (Janvier...)
strptime : de la chaîne de caractères à l'objet
Opération inverse : elle analyse une chaîne de caractères pour en créer un objet datetime. Il faut lui indiquer le format exact de la chaîne source.
# L'utilisateur a saisi cette date
date_texte = "14/07/2024 21:30"
# On précise le format correspondant
date_obj = datetime.strptime(date_texte, "%d/%m/%Y %H:%M")
print(date_obj) # 2024-07-14 21:30:00
print(type(date_obj)) #
Attention : Si le format ne correspond pas, Python lève une exception ValueError. Il faut toujours gérer cette possibilité avec un bloc try...except quand tu pars des données utilisateur.
Calculs et manipulations : le pouvoir de timedelta
Une des forces du module datetime est de permettre des calculs temporels de manière intuitive grâce à la classe timedelta. Elle représente une durée, une différence entre deux dates ou heures.
from datetime import datetime, timedelta
aujourdhui = datetime.now()
# Que se passera-t-il dans 10 jours ?
dans_10_jours = aujourdhui + timedelta(days=10)
print(dans_10_jours)
# Et il y a 3 semaines et 2 heures ?
il_y_a_longtemps = aujourdhui - timedelta(weeks=3, hours=2)
print(il_y_a_longtemps)
# Calculer la différence entre deux dates
naissance = datetime(2008, 5, 15)
age = aujourdhui - naissance
print(age) # Affiche une durée, par exemple : 6543 days, 10:15:30.123456
print(f"Tu as vécu environ {age.days} jours !")
Tu peux créer des timedelta avec les arguments days, seconds, microseconds, milliseconds, minutes, hours, et weeks. Les opérations d'addition et de soustraction avec des objets datetime sont ainsi très naturelles.
Aller plus loin : fuseaux horaires et timezone (avec zoneinfo)
Pour des applications qui interagissent avec des utilisateurs dans le monde entier, les fuseaux horaires deviennent incontournables. Depuis Python 3.9, le module zoneinfo est la méthode recommandée pour les gérer.
from datetime import datetime
from zoneinfo import ZoneInfo
# Heure locale (sans fuseau)
local_naive = datetime.now()
print("Naïve :", local_naive)
# Associer un fuseau horaire ("aware")
paris_tz = ZoneInfo("Europe/Paris")
paris_time = datetime.now(paris_tz)
print("Paris :", paris_time)
# Convertir dans un autre fuseau
new_york_tz = ZoneInfo("America/New_York")
ny_time = paris_time.astimezone(new_york_tz)
print("New York :", ny_time)
print(f"Différence : {paris_time - ny_time}") # Attention, affiche une durée, pas un nom de fuseau
Un objet "naïve" (naïf) n'a pas d'information de fuseau horaire. Un objet "aware" (conscient) en a une. Il est déconseillé de mélanger les deux types dans des opérations. Pour tes projets scolaires, tu peux souvent rester en "naïve" si tout se passe dans le même fuseau. Mais connaître cette notion est un vrai plus !
Un exemple de projet NSI : un minuteur intelligent
Mettons en pratique tout ça avec une idée de mini-projet : un minuteur qui, en plus de décompter, enregistre dans un fichier CSV chaque session avec sa date de début et sa durée.
import csv
from datetime import datetime, timedelta
import time
def minuteur(nom_tache, duree_minutes):
debut = datetime.now()
print(f"Début de '{nom_tache}' à {debut.strftime('%H:%M:%S')}")
# Simulation de l'attente (en vrai, tu ferais un décompte)
time.sleep(duree_minutes * 0.01) # Version accélérée pour la démo !
fin = datetime.now()
duree_reelle = fin - debut
# Enregistrement dans un fichier
with open('chronologie.csv', 'a', newline='') as f:
writer = csv.writer(f)
writer.writerow([nom_tache, debut.strftime('%Y-%m-%d %H:%M:%S'), str(duree_reelle)])
print(f"Tâche terminée. Durée : {duree_reelle}")
# Utilisation
minuteur("Révision NSI", 25)
minuteur("Pause", 5)
Ce projet simple combine datetime pour le timing, strftime pour le formatage dans le fichier, et timedelta (la variable duree_reelle) pour le calcul de la durée. Tu pourrais l'enrichir avec une interface graphique (Tkinter) ou une analyse des données enregistrées.
