Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonで指定した月の日数を求める方法(うるう年対応)

はじめに

ある年 Y と月 M が与えられたとき、その年・月に含まれる日数を返すプログラムを考えてみましょう。たとえば Y = 1992、M = 7 の場合は 31 日、Y = 2020、M = 2 の場合は 2020 年がうるう年であるため 29 日となります。

解き方の手順

この問題は、次のステップで解決できます。

  • 月が 2 月(m = 2)の場合:
    • その年がうるう年であれば 29 を返し、そうでなければ 28 を返す
  • [1, 3, 5, 7, 8, 10, 12] という要素を持つ配列(31 日ある月のリスト)を作成する
  • m がこのリストに含まれていれば 31 を返し、それ以外の場合は 30 を返す

うるう年の判定ルール

うるう年かどうかの判定は、以下の規則に従います。

  • 400 で割り切れる年 → うるう年
  • 100 で割り切れ、かつ 400 では割り切れない年 → 平年
  • 4 で割り切れる年 → うるう年

実装例(Python)

それでは、実際のコードを見てみましょう。

class Solution(object):
    def numberOfDays(self, y, m):
        leap = 0
        if y % 400 == 0:
            leap = 1
        elif y % 100 == 0:
            leap = 0
        elif y % 4 == 0:
            leap = 1
        if m == 2:
            return 28 + leap
        month_list = [1, 3, 5, 7, 8, 10, 12]
        if m in month_list:
            return 31
        return 30

ob1 = Solution()
print(ob1.numberOfDays(2020, 2))

入力

2020
2

出力

29

より簡単な方法:calendar モジュールの活用

Python の標準ライブラリには calendar モジュールが用意されており、monthrange() 関数を使えば、うるう年の判定を自分で実装する必要はありません。

import calendar

def numberOfDays(y, m):
    return calendar.monthrange(y, m)[1]

print(numberOfDays(2020, 2))  # 出力: 29
print(numberOfDays(1992, 7))  # 出力: 31

monthrange(year, month) は「その月の最初の日の曜日」と「その月の日数」をタプルで返します。インデックス [1] を指定することで日数だけを取り出せます。実務ではこちらの方法がシンプルで推奨されます。

まとめ

月の日数を求める際のポイントは、2 月とうるう年の判定です。自前でロジックを実装する場合は、400 年・100 年・4 年の割り算ルールを正しく理解しておくことが重要です。また、標準ライブラリの calendar.monthrange() を使えば、より簡潔かつ安全に実装できます。

  1. Pythonで階乗を計算する3つの方法|forループ・再帰・math.factorial()の使い方

    階乗(factorial)の計算は、データ分析をはじめとする数学的な処理において、Pythonでよく求められる操作の一つです。階乗とは、正の整数 n に対して、1から n までのすべての整数を掛け合わせた値のことです(例:5! = 1 × 2 × 3 × 4 × 5 = 120)。この記事では、Pythonで階乗を求める3つの方法を、コード例と実行結果とともにわかりやすく解説します。方法1:forループを使うforループで1から目的の数値まで順番に処理し、各ステップで掛け算を繰り返していく方法です。以下のプログラムでは、ユーザーに数値の入力を促し、ループ処理の前にint()で入力値を整数に変換

  2. PythonのEnum(列挙型)とは?基本から応用まで徹底解説

    PythonのEnumは、一意かつ不変の値に紐付けられたシンボリックな名前(メンバー)の集合、すなわち「列挙型」を作成するためのクラスです。列挙型のメンバー同士はシンボル名によって比較でき、列挙型そのものも反復処理(イテレーション)が可能です。Enumには主に以下のような特徴があります。オブジェクトの評価可能な文字列表現(repr())を持つnameキーワードを使ってメンバー名を表示できるtype()関数でEnumの型を確認できる基本的な使い方の例import enum # enumクラスを使って列挙型を定義 class Days(enum.Enum): Sun = 1 Mon