[解決!Python]うるう年かどうかを判定するには解決!Python

ある年がうるう年かどうかを判定するには、calendarモジュールが提供するisleap関数を使うのが簡単だ。また、同じ動作をする関数のコードも紹介する。

» 2021年12月07日 05時00分 公開
[かわさきしんじDeep Insider編集部]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

「解決!Python」のインデックス

連載目次

from calendar import isleap

year_list = [2000, 2019, 2020, 2021, 2100]
for year in year_list:
    result = isleap(year)
    print(f'{year} is a leap year: {result}')
# 出力結果:
#2000 is a leap year: True
#2019 is a leap year: False
#2020 is a leap year: True
#2021 is a leap year: False
#2100 is a leap year: False

def isleapyear(year):
    return year % 4 == 0 and (year % 100 != 0 or year % 400 == 0)

for year in year_list:
    result = isleapyear(year)
    print(f'{year} is a leap year: {result}')
# 出力結果は上に同じ

# datetimeオブジェクト、time.struct_timeオブジェクトを対象に判定する
from datetime import datetime
import time

dt = datetime.now()
result = isleap(dt.year)
print(f'{dt.year} is a leap year: {result}') # 2021 is a leap year: False

d = time.localtime()
result = isleap(d.tm_year)
print(f'{d.tm_year} is a leap year: {result}'# 2021 is a leap year: False

years_datetime_type = [datetime(year=y, month=1, day=1) for y in year_list]
for d in years_datetime_type:
    result = isleap(d.year)
    print(f'{d.year} is a leap year: {result}')

years_str_time = [datetime.timetuple(y) for y in years_datetime_type]
for d in years_str_time:
    result = isleap(d.tm_year)
    print(f'{d.tm_year} is a leap year: {result}')


うるう年かどうかの判定

 うるう年かどうかは以下のような条件を基に判定される。

  • その年が4で割り切れるなら、基本的にその年はうるう年
  • ただし、その年が100で割り切れるときには、その年はうるう年ではない
  • ただし、その年が400で割り切れるときには、その年はうるう年

 この条件は、Pythonに標準で添付のcalendarモジュールが提供するisleap関数を使うことで簡単に判定できる。

 以下に例を示す。

from calendar import isleap

year_list = [2000, 2019, 2020, 2021, 2100]
for year in year_list:
    result = isleap(year)
    print(f'{year} is a leap year: {result}')
# 出力結果:
#2000 is a leap year: True
#2019 is a leap year: False
#2020 is a leap year: True
#2021 is a leap year: False
#2100 is a leap year: False


 この例では、isleap関数に2000、2019、2020、2021、2100を渡している。これらの年がうるう年かどうかは上記の条件に照らし合わせると以下のようになる。

  • 2000:4で割り切れ、100で割り切れるが、400で割り切れるのでうるう年
  • 2019:4で割り切れないのでうるう年ではない(平年)
  • 2020:4で割り切れ、100で割り切れないのでうるう年
  • 2021:4で割り切れないのでうるう年ではない
  • 2100:4で割り切れ、100で割り切れ、400で割り切れないのでうるう年ではない

 実際の出力結果もそのようになっていることに注目されたい。

 また、この判定を行う関数は自分で次のように定義することもできる(実際、calendarモジュールのソースコードでも以下と同じロジックでisleap関数が実装されている)。

def isleapyear(year):
    return year % 4 == 0 and (year % 100 != 0 or year % 400 == 0)

for year in year_list:
    result = isleapyear(year)
    print(f'{year} is a leap year: {result}')
# 出力結果は上に同じ


datetimeオブジェクト、time.struct_timeオブジェクトを対象に判定する

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。