Aller au contenu

Date & heure#

courant

Module datetime#

from datetime import date, time, datetime, timedelta

date.today()                     # date du jour
datetime.now()                     # date + heure actuelles
datetime(2024, 1, 15, 10, 30)         # construction explicite

Attributs#

d = datetime.now()
d.year; d.month; d.day
d.hour; d.minute; d.second
d.weekday()   # 0 = lundi ... 6 = dimanche

Formatage (strftime) et parsing (strptime)#

d.strftime("%d/%m/%Y")            # "15/01/2024"
d.strftime("%Y-%m-%d %H:%M:%S")    # "2024-01-15 10:30:00"
datetime.strptime("15/01/2024", "%d/%m/%Y")   # -> objet datetime
Code Signification
%d jour (01-31)
%m mois (01-12)
%Y année sur 4 chiffres
%H heure (00-23)
%M minutes
%S secondes
%A nom du jour (locale)
%B nom du mois (locale)

Arithmétique de dates : timedelta#

demain = date.today() + timedelta(days=1)
dans_une_semaine = datetime.now() + timedelta(weeks=1)
duree = datetime(2024, 1, 20) - datetime(2024, 1, 15)
duree.days          # 5
duree.total_seconds()

Comparaison#

datetime(2024, 1, 1) < datetime(2024, 6, 1)   # True

ISO 8601#

datetime.now().isoformat()          # "2024-01-15T10:30:00.123456"
datetime.fromisoformat("2024-01-15T10:30:00")

Piège

datetime.now() renvoie une date « naïve » (sans fuseau horaire) : comparer une date naïve à une date avec fuseau lève un TypeError.

Fuseaux horaires : zoneinfo (≥ 3.9)#

from datetime import datetime, timezone
from zoneinfo import ZoneInfo

datetime.now(timezone.utc)                    # instant courant en UTC (recommandé pour stocker)
datetime.now(ZoneInfo("Europe/Paris"))         # instant courant à Paris

utc = datetime(2024, 7, 14, 12, 0, tzinfo=timezone.utc)
utc.astimezone(ZoneInfo("Europe/Paris"))        # 14:00 (heure d'été gérée automatiquement)

Règle usuelle : stocker et calculer en UTC, convertir en fuseau local uniquement à l'affichage.