📅python

Manipuler des dates et heures en Python avec datetime

30 mars 2026 5 min de lecture

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.

📚 Pour aller plus loin

Questions fréquentes

Quelle est la différence entre datetime.now() et datetime.today() ?

<code>datetime.today()</code> renvoie la date et l'heure actuelles locales, mais sous la forme d'un objet datetime "naïve" (sans fuseau horaire). <code>datetime.now()</code> est plus flexible : sans argument, il se comporte comme <code>today()</code>, mais on peut lui passer un fuseau horaire (objet <code>tzinfo</code>) pour obtenir un datetime "aware". En pratique, pour débuter, tu peux utiliser les deux indifféremment.

Comment calculer l'âge exact d'une personne en années, mois et jours ?

C'est plus délicat qu'il n'y paraît car les mois n'ont pas tous la même durée ! Tu peux obtenir l'âge en jours avec <code>timedelta.days</code>. Pour un calcul précis en années/mois/jours, il faut comparer jour/mois de la date de naissance avec la date actuelle. Une approche simple : <code>age = aujourdhui.year - naissance.year - ((aujourdhui.month, aujourdhui.day) < (naissance.month, naissance.day))</code>. Cela donne l'âge en années révolues. Pour les mois et jours restants, des calculs supplémentaires sont nécessaires.

Pourquoi strptime me donne une erreur ValueError ?

L'erreur <code>ValueError: time data '...' does not match format '...'</code> signifie que la chaîne de caractères que tu essaies de parser ne correspond pas exactement au format que tu as spécifié en deuxième argument. Vérifie les espaces, les séparateurs (/, -, :), la présence ou l'absence de secondes, et l'ordre des codes (%d, %m, %Y). Un 0 manquant sur un jour ou un mois à un chiffre peut aussi causer l'erreur. Utilise un bloc <code>try...except ValueError</code> pour gérer proprement les entrées utilisateur erronées.

Est-ce que je peux comparer deux dates avec > ou < ?

Oui, tout à fait ! Les opérateurs de comparaison (<, >, <=, >=, ==, !=) fonctionnent parfaitement sur les objets <code>date</code> et <code>datetime</code>. Python les compare chronologiquement. Par exemple : <code>if date_rendu > date_limite: print("En retard !")</code>. C'est très utile pour vérifier des délais ou trier des listes de dates.

Bravo ! Tu as lu cet article
Inscris-toi pour sauvegarder ta progression et gagner des XP
Creer mon compte
datetime Pythondates heures
Pixel