Skip to content

Date et Heure en Python

La gestion des dates et des heures est une exigence courante en programmation. Python offre des modules puissants pour travailler avec les dates, les heures et les intervalles de temps.

Les principaux modules intégrés sont :

  • time : Fournit des fonctions liées à l’heure système, y compris la mesure du temps et la mise en veille. Souvent de plus bas niveau.
  • datetime : Offre des classes pour manipuler les dates et les heures de manière plus orientée objet. Généralement préféré pour la plupart des calculs et représentations de date/heure.
  • calendar : Fournit des fonctions liées au calendrier, comme la génération de calendriers textuels.

De nombreux systèmes mesurent le temps comme le nombre de secondes écoulées depuis un point de départ spécifique appelé l’Époque. Pour les systèmes basés sur Unix (y compris Linux et macOS), l’époque est typiquement le 1er janvier 1970, 00:00:00 (UTC). Windows peut utiliser une époque différente pour certaines fonctions système, mais le module time de Python utilise systématiquement l’époque Unix.

La fonction time.time() renvoie l’heure actuelle sous la forme d’un nombre à virgule flottante représentant les secondes écoulées depuis l’époque. Cette valeur est parfois appelée « timestamp Unix » ou « ticks » (bien que ‘ticks’ puisse avoir d’autres significations dans différents contextes).

Exemple : Obtenir les secondes depuis l’époque

Section titled “Exemple : Obtenir les secondes depuis l’époque”
#!/usr/bin/env python3
import time
seconds_since_epoch = time.time()
print(f"Secondes depuis l'époque : {seconds_since_epoch}")

Cela produirait une sortie similaire à :

Secondes depuis l'époque : 1678886400.123456

Travailler directement avec les secondes de l’époque peut être utile pour de simples calculs de différence de temps, mais la représentation de dates et d’heures spécifiques nécessite généralement des formats plus structurés.

Plusieurs fonctions du module time travaillent avec ou renvoient un objet de type tuple appelé time.struct_time. Il représente un point spécifique dans le temps avec des composants comme l’année, le mois, le jour, l’heure, la minute, etc.

La structure contient les attributs suivants (accessibles par index ou par nom) :

IndexAttributValeurs
0tm_yearAnnée (par exemple, 2023)
1tm_monMois (1-12)
2tm_mdayJour du mois (1-31)
3tm_hourHeure (0-23)
4tm_minMinute (0-59)
5tm_secSeconde (0-61 ; inclut les secondes intercalaires)
6tm_wdayJour de la semaine (0=Lundi à 6=Dimanche)
7tm_ydayJour de l’année (1-366)
8tm_isdstIndicateur d’heure d’été (0, 1, ou -1 si inconnu)

Obtention de l’heure actuelle sous forme de struct_time

Section titled “Obtention de l’heure actuelle sous forme de struct_time”

time.localtime() convertit les secondes depuis l’époque (ou l’heure actuelle si aucun argument n’est donné) en un struct_time représentant l’heure locale.

#!/usr/bin/env python3
import time
local_time_struct = time.localtime() # Utilise l'heure actuelle
print(f"Structure de temps locale : {local_time_struct}")
# Accès aux éléments
print(f"Année : {local_time_struct.tm_year}")
print(f"Heure : {local_time_struct.tm_hour}")

time.gmtime() fonctionne de manière similaire mais renvoie le struct_time en Temps Universel Coordonné (UTC).

Bien que struct_time soit structuré, il n’est pas très lisible par l’homme. Python fournit des fonctions pour formater le temps en chaînes de caractères.

time.asctime() : Convertit un struct_time (ou l’heure locale actuelle si aucun argument) en une chaîne de caractères standard de 24 caractères.

#!/usr/bin/env python3
import time
# Utilisation de l'heure locale actuelle
ascii_time_now = time.asctime()
print(f"Heure formatée (asctime) : {ascii_time_now}")
# Utilisation d'un struct_time spécifique
local_time_struct = time.localtime()
ascii_time_local = time.asctime(local_time_struct)
print(f"Heure formatée à partir de struct : {ascii_time_local}")

La sortie pourrait ressembler à : Heure formatée (asctime) : Mer Mar 15 12:30:00 2023

time.strftime() : Offre beaucoup plus de flexibilité en permettant des codes de format personnalisés.

#!/usr/bin/env python3
import time
local_time_struct = time.localtime()
# Exemples de codes de format :
# %Y - Année avec siècle (par exemple, 2023)
# %m - Mois en décimal avec zéro initial (01-12)
# %d - Jour du mois en décimal avec zéro initial (01-31)
# %H - Heure (horloge 24h) en décimal avec zéro initial (00-23)
# %M - Minute en décimal avec zéro initial (00-59)
# %S - Seconde en décimal avec zéro initial (00-61)
# %a - Nom abrégé du jour de la semaine (Dim, Lun, ...)
# %A - Nom complet du jour de la semaine (Dimanche, Lundi, ...)
# %b - Nom abrégé du mois (Jan, Fév, ...)
# %B - Nom complet du mois (Janvier, Février, ...)
formatted_string = time.strftime("%Y-%m-%d %H:%M:%S", local_time_struct)
print(f"Format personnalisé 1 : {formatted_string}")
formatted_string_verbose = time.strftime("%A, %B %d, %Y (%I:%M:%S %p %Z)", local_time_struct)
# %I - Heure (horloge 12h), %p - AM/PM, %Z - Nom du fuseau horaire
print(f"Format personnalisé 2 : {formatted_string_verbose}")

strftime est très utile pour créer des chaînes de date/heure lisibles par l’homme dans divers formats.

Fonctions clés du module time :

FonctionDescription
time.time()Renvoie l’heure actuelle en secondes depuis l’époque (flottant).
time.sleep(secs)Suspend l’exécution pendant le nombre de secondes spécifié (peut être un flottant).
time.localtime([secs])Convertit les secondes depuis l’époque en struct_time locale.
time.gmtime([secs])Convertit les secondes depuis l’époque en struct_time UTC.
time.mktime(t)Convertit un struct_time local t en secondes depuis l’époque.
time.asctime([t])Convertit un struct_time t en une chaîne formatée standard.
time.strftime(format[, t])Formate un struct_time t en une chaîne selon les codes de format.
time.strptime(string, format)Analyse une string représentant une heure selon les codes de format, renvoyant un struct_time.
time.perf_counter()Renvoie une valeur de compteur de performance haute résolution (pour mesurer de courtes durées). La valeur absolue est indéfinie, seule la différence entre les appels est valide.
time.process_time()Renvoie la somme du temps CPU système et utilisateur du processus actuel. Utilisé pour l’évaluation de l’utilisation du CPU.

Remarque : time.clock() a été déprécié en Python 3.3 et supprimé en 3.8. Utilisez time.perf_counter() ou time.process_time() à la place, selon que vous avez besoin du temps réel (wall-clock time) pour la mesure des performances ou du temps CPU.

Bien que le module time soit utile, le module datetime offre une manière plus puissante et orientée objet de travailler avec les dates et les heures. Il est généralement recommandé pour la plupart des applications.

Classes clés dans datetime :

  • datetime.date : Représente une date (année, mois, jour).
  • datetime.time : Représente une heure (heure, minute, seconde, microseconde).
  • datetime.datetime : Représente à la fois la date et l’heure.
  • datetime.timedelta : Représente une durée ou une différence entre deux dates ou heures.
  • datetime.timezone : Représente les informations de fuseau horaire (une gestion plus robuste des fuseaux horaires nécessite souvent des bibliothèques externes comme pytz ou utilise zoneinfo à partir de Python 3.9+).
#!/usr/bin/env python3
from datetime import datetime, date, timedelta
# Obtenir la date et l'heure actuelles
now = datetime.now()
print(f"Datetime actuelle : {now}")
# Obtenir la date actuelle
today = date.today()
print(f"Date actuelle : {today}")
# Créer des objets date et datetime spécifiques
d1 = date(2024, 7, 20)
dt1 = datetime(2024, 7, 20, 15, 30, 0)
print(f"Date spécifique : {d1}")
print(f"Datetime spécifique : {dt1}")
# Formatage utilisant strftime (également disponible sur les objets datetime)
print(f"Datetime formatée : {now.strftime('%Y/%m/%d %H:%M')}")
# Arithmétique de date utilisant timedelta
yesterday = today - timedelta(days=1)
next_week = today + timedelta(weeks=1)
print(f"Hier était : {yesterday}")
print(f"La semaine prochaine sera : {next_week}")
# Calculer la différence entre les datetimes
diff = now - dt1
print(f"Différence entre maintenant et dt1 : {diff}")
print(f"Différence en secondes : {diff.total_seconds()}")
# Analyse de chaînes en objets datetime
date_string = "2023-01-15 10:00:00"
parsed_dt = datetime.strptime(date_string, "%Y-%m-%d %H:%M:%S")
print(f"Datetime analysée : {parsed_dt}")

Le module datetime offre une interface plus propre pour l’arithmétique et la manipulation des dates et des heures par rapport à time.struct_time.

Le module calendar fournit des fonctions liées au calendrier, comme la génération de calendriers textuels mensuels ou annuels et la détermination des années bissextiles.

Exemple : Affichage du calendrier d’un mois

Section titled “Exemple : Affichage du calendrier d’un mois”
#!/usr/bin/env python3
import calendar
# Obtenir un calendrier textuel formaté pour mars 2024
cal_text = calendar.month(2024, 3)
print("Calendrier pour mars 2024 :")
print(cal_text)
# Vérifier si c'est une année bissextile
is_leap = calendar.isleap(2024)
print(f"Est-ce que 2024 est une année bissextile ? {is_leap}")
# Obtenir le code du jour de la semaine pour une date spécifique (0=Lundi)
weekday_code = calendar.weekday(2024, 3, 15)
print(f"Code du jour de la semaine pour 2024-03-15 : {weekday_code} (Vendredi)")
# Définir le premier jour de la semaine (par exemple, Dimanche = 6)
# calendar.setfirstweekday(calendar.SUNDAY)
# cal_text_sun_start = calendar.month(2024, 3)
# print("\nCalendrier commençant le dimanche :")
# print(cal_text_sun_start)

Pour une gestion plus avancée des dates/heures, notamment impliquant les fuseaux horaires ou l’analyse de chaînes de date complexes, considérez ces bibliothèques tierces populaires :