Skip to content

Déterminer, compter et lister les années bissextiles en Python

En Python, le module de calendrier de la bibliothèque standard fournit des fonctions pour déterminer si une année donnée est bissextile ou non et pour renvoyer le nombre d’années bissextiles dans une période spécifiée.

Cet article décrit le contenu suivant.

  • L’algorithme des années bissextiles
  • Déterminer si une année est une année bissextile :calendar.isleap()
  • Comptez le nombre d’années bissextiles dans une période spécifiée :calendar.leapdays()
  • Lister les années bissextiles dans une période spécifiée
  • Déterminer si un objet datetime ou date est une année bissextile

Consultez l’article suivant pour savoir comment obtenir un calendrier texte ou HTML avec le module calendrier.

L’algorithme des années bissextiles

L’algorithme qui détermine si une année est une année bissextile ou une année commune dans le calendrier grégorien est représenté par le pseudocode suivant :

if (year is not divisible by 4) then (it is a common year)
else if (year is not divisible by 100) then (it is a leap year)
else if (year is not divisible by 400) then (it is a common year)
else (it is a leap year)

Déterminer si une année est une année bissextile :calendar.isleap()

Utilisez calendar.isleap() pour vérifier si une année est bissextile ou non.

import calendar

print(calendar.isleap(2019))
# False

print(calendar.isleap(2020))
# True

print(calendar.isleap(1900))
# False

print(calendar.isleap(2000))
# True

Le code source de calendar.isleap() est le suivant. L’opérateur % (modulo) et et, ou sont utilisés.

def isleap(year):
    """Return True for leap years, False for non-leap years."""
    return year % 4 == 0 and (year % 100 != 0 or year % 400 == 0)

Comptez le nombre d’années bissextiles dans une période spécifiée :calendar.leapdays()

Utilisez calendar.leapdays() pour compter les années bissextiles dans une période spécifiée.

Spécifiez deux ans comme calendar.leapdays(y1, y2). La période est y1 <= x < y2, qui inclut y1 mais pas y2.

print(calendar.leapdays(2019, 2030))
# 3

print(calendar.leapdays(2019, 2020))
# 0

Lister les années bissextiles dans une période spécifiée

Pour répertorier les années bissextiles dans une période spécifiée, utilisez calendar.isleap() comme condition pour les compréhensions de liste.

print([y for y in range(2019, 2030) if calendar.isleap(y)])
# [2020, 2024, 2028]

print([y for y in range(2000, 2020) if calendar.isleap(y)])
# [2000, 2004, 2008, 2012, 2016]

Notez que dans le cas de range(start, end), end n’est pas inclus.

Déterminer si un objet datetime ou date est une année bissextile

La bibliothèque standard de Python a un module datetime qui gère les dates et les heures.

Le module datetime fournit datetime.datetime pour la date et l’heure et datetime.date pour la date uniquement.

datetime.datetime et datetime.date ont l’attribut year. Si vous souhaitez vérifier si l’année indiquée par ces objets est bissextile ou non, passez l’attribut year à calendar.isleap().

import calendar
import datetime

dt = datetime.datetime(2019, 1, 1, 10, 10, 10)
print(dt)
# 2019-01-01 10:10:10

print(calendar.isleap(dt.year))
# False

d = datetime.date(2020, 1, 1)
print(d)
# 2020-01-01

print(calendar.isleap(d.year))
# True

Par exemple, vous pouvez définir la fonction suivante.

def isleap_datetime(dt):
    return calendar.isleap(dt.year)

print(dt)
# 2019-01-01 10:10:10

print(isleap_datetime(dt))
# False

print(d)
# 2020-01-01

print(isleap_datetime(d))
# True

Si vous ne souhaitez pas utiliser le module calendrier, vous pouvez définir une fonction comme celle-ci.

def isleap_datetime2(dt):
    return dt.year % 4 == 0 and (dt.year % 100 != 0 or dt.year % 400 == 0)

print(dt)
# 2019-01-01 10:10:10

print(isleap_datetime2(dt))
# False

print(d)
# 2020-01-01

print(isleap_datetime2(d))
# True