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#
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.