
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