Skip to content

Determinare, contare ed elencare gli anni bisestili in Python

Python

In Python, la libreria fornisce funzioni per il modulo calendario se un dato anno è bisestile o meno e per restituire il numero di anni bisestili in un periodo specificato.

In questo articolo vengono descritti i seguenti contenuti.

  • L’algoritmo per gli anni bisestili
  • Determina se un anno è bisestile:calendar.isleap()
  • Conta il numero di anni bisestili in un periodo specificato:calendar.leapdays()
  • Elenca gli anni bisestili in un periodo specificato
  • Determina se un oggetto datetime o date è un anno bisestile

Consulta il seguente articolo su come ottenere un calendario di testo o HTML con il modulo calendario.

L’algoritmo per gli anni bisestili

L’algoritmo determina se un anno è bisestile o un anno comune nel calendario gregoriano è rappresentato dal seguente pseudocodice:

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)

Determina se un anno è bisestile:calendar.isleap()

Usa calendar.isleap() per verificare se un anno è bisestile o meno.

import calendar

print(calendar.isleap(2019))
# False

print(calendar.isleap(2020))
# True

print(calendar.isleap(1900))
# False

print(calendar.isleap(2000))
# True

Il codice sorgente di calendar.isleap() è il seguente. Vengono utilizzati l’operatore % (modulo) ee, o.

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)

Conta il numero di anni bisestili in un periodo specificato:calendar.leapdays()

Usa calendar.leapdays() per contare gli anni bisestili in un periodo specificato.

Specifica due anni come calendar.leapdays(y1, y2). Il periodo è y1 <= x < y2, che include y1 ma non y2.

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

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

Elenca gli anni bisestili in un periodo specificato

Per elencare gli anni bisestili in un periodo specificato, utilizzare calendar.isleap() come condizione per la comprensione dell’elenco.

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]

Si noti che nel caso di intervallo (inizio, fine), la fine non è inclusa.

Determina se un oggetto datetime o date è un anno bisestile

La libreria standard di Python ha un modulo datetime che gestisce date e orari.

Il modulo datetime fornisce datetime.datetime per la data e l’ora e datetime.date solo per la data.

Sia datetime.datetime che datetime.date hanno l’attributo anno. Se vuoi controllare se l’anno indicatore da questi oggetti è bisestile o meno, passa l’attributo year a 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

Ad esempio, è possibile definire la seguente funzione.

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

Se non si desidera utilizzare il modulo calendario, è possibile definire una funzione come la seguente.

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