Manipuler les dates, les heures et les durées
datetime : dates, heures et durées
| Élément | Rôle |
|---|---|
date |
Date sans heure. |
datetime |
Date et heure. |
timedelta |
Durée ou décalage. |
date.today() |
Date locale courante. |
datetime.now(tz) |
Date et heure courantes dans un fuseau. |
fromisoformat(text) |
Lire une représentation ISO compatible. |
strptime(text, format) |
Lire une date selon un format. |
strftime(format) |
Produire une chaîne formatée. |
isoformat() |
Produire une représentation ISO. |
from datetime import date, datetime, timedelta, timezone
start = date(2026, 10, 15)
print(start + timedelta(days=7)) # 2026-10-22
meeting = datetime.strptime("15/10/2026 14:30", "%d/%m/%Y %H:%M")
print(meeting.strftime("%d/%m/%Y")) # 15/10/2026
now_utc = datetime.now(timezone.utc)
print(now_utc.isoformat())
Pour un instant échangé entre systèmes, utilisons généralement une date avec fuseau, souvent en UTC. Une date sans fuseau ne permet pas, à elle seule, de situer un instant mondialement.
Parallèle C# et .NET
DateOnly start = new DateOnly(2026, 10, 15);
Console.WriteLine(start.AddDays(7).ToString("yyyy-MM-dd", CultureInfo.InvariantCulture));
DateTime meeting = DateTime.ParseExact("15/10/2026 14:30", "dd/MM/yyyy HH:mm",
CultureInfo.InvariantCulture);
Console.WriteLine(meeting.ToString("dd/MM/yyyy", CultureInfo.InvariantCulture));
DateTimeOffset nowUtc = DateTimeOffset.UtcNow;
Console.WriteLine(nowUtc.ToString("O"));
DateOnly correspond à une date, TimeOnly à une heure et TimeSpan à une durée. DateTimeOffset représente une date avec décalage UTC, sans conserver les règles d’un fuseau géographique. Les formats diffèrent : %d/%m/%Y devient dd/MM/yyyy. Le format aller-retour O est proche du besoin couvert par isoformat(), sans garantir le même texte.
zoneinfo : fuseaux horaires géographiques
ZoneInfo applique les règles d'un fuseau IANA, dont les changements d'heure.
from datetime import datetime, timezone
from zoneinfo import ZoneInfo
utc_date = datetime(2026, 7, 1, 12, tzinfo=timezone.utc)
paris_date = utc_date.astimezone(ZoneInfo("Europe/Paris"))
print(paris_date.isoformat()) # 2026-07-01T14:00:00+02:00
Les données de fuseaux doivent être disponibles. Sur certains systèmes, notamment Windows, leur fourniture peut nécessiter le package tiers tzdata.
Parallèle C# et .NET
string zoneId = OperatingSystem.IsWindows() ? "Romance Standard Time" : "Europe/Paris";
TimeZoneInfo zone = TimeZoneInfo.FindSystemTimeZoneById(zoneId);
var utc = new DateTimeOffset(2026, 7, 1, 12, 0, 0, TimeSpan.Zero);
DateTimeOffset paris = TimeZoneInfo.ConvertTime(utc, zone);
Console.WriteLine(paris.ToString("yyyy-MM-ddTHH:mm:sszzz"));
// 2026-07-01T14:00:00+02:00
TimeZoneInfo applique les règles du fuseau. Les identifiants disponibles dépendent du système et des données de globalisation. Le code sélectionne ici un identifiant Windows ou IANA. Un DateTimeOffset conserve le décalage obtenu, pas l’identité du fuseau ; conservons aussi celle-ci pour les besoins de planification.
time : attentes et mesures de durée
| Fonction | Rôle |
|---|---|
time() |
Horodatage en secondes depuis l'époque Unix. |
sleep(seconds) |
Suspendre le thread appelant. |
perf_counter() |
Mesurer un intervalle avec une horloge de haute résolution. |
monotonic() |
Horloge qui ne recule pas lors d'une correction de l'heure système. |
import time
start = time.perf_counter()
total = sum(range(100_000))
elapsed = time.perf_counter() - start
print(f"Durée : {elapsed:.6f} seconde(s)")
Utilisons une différence entre deux lectures de perf_counter() pour mesurer une durée. Dans une coroutine, préférons await asyncio.sleep(...) à une attente bloquante.
Parallèle C# et .NET
var watch = Stopwatch.StartNew();
long total = Enumerable.Range(0, 100_000).Sum(n => (long)n);
watch.Stop();
Console.WriteLine($"Durée : {watch.Elapsed.TotalSeconds:F6} seconde(s)");
long unixSeconds = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
Stopwatch correspond à la mesure d’intervalle avec une horloge adaptée. Thread.Sleep() bloque un thread ; await Task.Delay(...) fournit une attente asynchrone. La projection en long évite ici le dépassement de int lors de la somme, alors que les entiers Python ont une précision arbitraire.