HOWTO · Python
Soustraire des objets datetime en Python
Découvrez comment soustraire deux objets datetime en Python et convertir la durée obtenue.
Sur cette page
Pour calculer le temps écoulé entre deux objets datetime, soustrayez le plus ancien du plus récent avec later - earlier. Python renvoie un timedelta, qui représente la durée séparant ces deux valeurs. Vous pouvez consulter cette durée en jours et en secondes, ou la convertir en un nombre total de secondes, de minutes ou d’heures.
Utiliser le module datetime pour soustraire des objets datetime en Python
Le module datetime fournit des objets représentant des dates et des heures. Créez chaque valeur à partir d’une année, d’un mois et d’un jour ; vous pouvez aussi préciser les heures, les minutes, les secondes et les microsecondes. L’exemple utilise des valeurs fixes : son résultat ne dépend donc pas de l’heure à laquelle vous l’exécutez.
from datetime import datetime
earlier = datetime(2024, 5, 1, 9, 0)
later = datetime(2024, 5, 1, 11, 30)
duration = later - earlier
print(duration)
print(duration.total_seconds())
print(duration.total_seconds() / 60)
print(duration.total_seconds() / 3600)
2:30:00
9000.0
150.0
2.5
Le résultat est un timedelta de deux heures et trente minutes. Ses attributs days, seconds et microseconds décrivent la durée sous la forme de composantes normalisées. Pour obtenir le nombre total de secondes écoulées, appelez total_seconds() sur le timedelta (et non sur un objet datetime). Divisez cette valeur par 60 pour obtenir des minutes, ou par 3 600 pour obtenir des heures. Ces divisions conservent les fractions lorsque la durée ne correspond pas à un nombre entier de minutes ou d’heures.
L’attribut days donne le nombre de jours entiers, tandis que seconds indique les secondes restantes dans la durée normalisée. Aucun de ces attributs ne remplace le nombre total de secondes. Ainsi, pour une durée supérieure à un jour, seconds peut être inférieur à 86 400. Utilisez total_seconds() pour obtenir un seul décompte couvrant toute la durée. La valeur renvoyée peut être un nombre à virgule flottante si la durée comprend des microsecondes.
Si vous avez besoin d’unités entières, choisissez explicitement une règle d’arrondi. La conversion avec int() tronque vers zéro ; elle n’arrondit pas à l’unité la plus proche. De plus, une année n’a pas une durée fixe : considérer 365 jours comme une année n’est qu’une approximation, car les années bissextiles et les limites entre les mois influent sur les calculs calendaires. Pour répondre à une question portant sur une date — par exemple « un an plus tard » —, choisissez une interprétation fondée sur le calendrier plutôt qu’un nombre de secondes écoulées.
La soustraction convient si les deux valeurs peuvent être comparées de façon cohérente. Vous pouvez soustraire entre elles des valeurs naïves, c’est-à-dire sans information de fuseau horaire. Pour calculer le temps écoulé entre des valeurs avec fuseau horaire, normalisez-les toutes deux en UTC avec astimezone(timezone.utc), notamment si l’intervalle traverse un changement de fuseau. Mélanger une valeur naïve et une valeur avec fuseau horaire déclenche une TypeError ; attribuez ou convertissez explicitement les informations de fuseau avant la soustraction.