Pythonで日数が計算できるプログラムを作ってみた

### 前置き
明日から7月に入り、2024年も日数的には折り返し点になる。そこで、今日はPythonで、日数が計算できるプログラムコードの作成に着手してみた。

### プログラムコード
``` python
from datetime import datetime

# ユーザーからの日付入力を取得する関数
def get_date_input(prompt):
    while True:
        try:
            date_str = input(prompt)
            # 日付フォーマットは"YYYY-MM-DD"を使用
            date_obj = datetime.strptime(date_str, "%Y-%m-%d")
            return date_obj
        except ValueError:
            print("日付の形式が正しくありません。再度入力してください。")

# 2つの日付の間の日数を計算する関数
def calculate_days_between_dates(date1, date2):
    delta = date2 - date1
    return abs(delta.days)

# メイン関数
def main():
    print("2つの日付の間の日数を計算します。")
    date1 = get_date_input("最初の日付を入力してください（例: 2023-01-01）: ")
    date2 = get_date_input("2つ目の日付を入力してください（例: 2023-12-31）: ")

    days_between = calculate_days_between_dates(date1, date2)
    print(f"{date1.strftime('%Y-%m-%d')} と {date2.strftime('%Y-%m-%d')} の間の日数は {days_between} 日です。")

if __name__ == "__main__":
    main()
```
### プログラムコードの説明
このプログラムは、ユーザーに2つの日付を "YYYY-MM-DD" 形式で入力させ、その間の日数を計算して出力します。 datetime モジュールを使用して日付の操作を行っています。

### 出力結果
``` python
2つの日付の間の日数を計算します。
最初の日付を入力してください（例: 2023-01-01）: 2023-01-01
2つ目の日付を入力してください（例: 2023-12-31）: 2023-12-31
2023-01-01 と 2023-12-31 の間の日数は 364 日です。
2つの日付の間の日数を計算します。
最初の日付を入力してください（例: 2023-01-01）: 2020-01-01
2つ目の日付を入力してください（例: 2023-12-31）: 2020-12-31
2020-01-01 と 2020-12-31 の間の日数は 365 日です。
```
ちゃんとこのように、2023年（昨年）は平年でしたので、間の日数は364日。
今年同様、2020年はうるう年でしたので、間の日数は365日と出力されている。

しかし、2023年は日数が365日、2020年は日数が366日なのに、なんでそのように出力されないのだろうかと疑問に思った。そこで、私は、ユーザーが、2つの日付を入力したら、その日付の差と何日間になるか、両方出力するコードに改良した。

### 改良したプログラムコード
``` python
from datetime import datetime, timedelta

# ユーザーからの日付入力を取得する関数
def get_date_input(prompt):
    while True:
        try:
            date_str = input(prompt)
            # 日付フォーマットは"YYYY-MM-DD"を使用
            date_obj = datetime.strptime(date_str, "%Y-%m-%d")
            return date_obj
        except ValueError:
            print("日付の形式が正しくありません。再度入力してください。")

# 2つの日付の間の日数を計算する関数
def calculate_days(date1, date2):
    delta = date2 - date1
    days_difference = abs(delta.days)
    days_inclusive = days_difference + 1  # 開始日と終了日を含む場合
    return days_difference, days_inclusive

# メイン関数
def main():
    print("日付の間の日数を計算します。")
    date1 = get_date_input("最初の日付を入力してください（例: 2023-01-01）: ")
    date2 = get_date_input("2つ目の日付を入力してください（例: 2023-12-31）: ")

    days_difference, days_inclusive = calculate_days(date1, date2)
    print(f"{date1.strftime('%Y-%m-%d')} と {date2.strftime('%Y-%m-%d')} の間の差は {days_difference} 日です。")
    print(f"{date1.strftime('%Y-%m-%d')} と {date2.strftime('%Y-%m-%d')} の間は {days_inclusive} 日間です。")

if __name__ == "__main__":
    main()
```
### オリジナルコード（何日間と何日違い）との相違点
何日間とは、開始日と終了日を含む期間の日数です。
計算方法は、終了日と開始日を引いた差の日数に1を足します。
例えば、2024年1月1日から1月5日は、5日間になります。
ここでは、何日間をdays_inclusiveとして定義しています。
プログラムコードの計算式：days_inclusive = days_difference + 1

何日違いとは、開始日と終了日の間の差の日数です。
例えば、2024年1月7日から1月11日は、4日違いになります。
ここでは、何日違いをdays_differenceとして定義しています。
プログラムコードの計算式：days_difference = abs((date2 - date1).days)

### 出力結果
``` python
日付の間の日数を計算します。
最初の日付を入力してください（例: 2023-01-01）: 2024-01-01
2つ目の日付を入力してください（例: 2023-12-31）: 2024-12-31
2024-01-01 と 2024-12-31 の間の差は 365 日です。
2024-01-01 と 2024-12-31 の間は 366 日間です。
日付の間の日数を計算します。
最初の日付を入力してください（例: 2023-01-01）: 2021-01-01
2つ目の日付を入力してください（例: 2023-12-31）: 2021-12-31
2021-01-01 と 2021-12-31 の間の差は 364 日です。
2021-01-01 と 2021-12-31 の間は 365 日間です。
 ```
今年2024年は4年に1回のうるう年なので366日間、差は365日
平年だった2021年に関しては、365日間、差が364日と表示されている。

皆さんも時間がある時にこのプログラムコードを参考にして、2つの日付と差、間の日数を計算してみてはいかがでしょうか。