Pythonを基礎から学ぶその10 祝日まであと何日か

この記事は、[JavaとPythonを基礎から学びたい私のための Advent Calendar 2024](https://qiita.com/advent-calendar/2024/aruhitonocalendar)の22日目の記事です。
# jpholiday
世の中には、日本の祝日をまとめたjpholidayなるものがあるようです。せっかく存在しているので、ぜひ使ってみようと思います。外部ライブラリなのでインストールして使用します。
まずは祝日の一覧を取得してみます。
```py
import jpholiday as jh
print(jh.year_holidays(2024))
```
結果:[(datetime.date(2024, 1, 1), '元日'), (datetime.date(2024, 1, 8), '成人の日'), (datetime.date(2024, 2, 11), '建国記念の日'), (datetime.date(2024, 2, 12), '建国記念の日 振替休日'), (datetime.date(2024, 2, 23), '天皇誕生日'), (datetime.date(2024, 3, 20), '春分の日'), (datetime.date(2024, 4, 29), '昭和の日'), (datetime.date(2024, 5, 3), '憲法記念日'), (datetime.date(2024, 5, 4), 'みどりの日'), (datetime.date(2024, 5, 5), 'こどもの日'), (datetime.date(2024, 5, 6), 'こどもの日 振替休日'), (datetime.date(2024, 7, 15), '海の日'), (datetime.date(2024, 8, 11), '山の日'), (datetime.date(2024, 8, 12), '山の日 振替休日'), (datetime.date(2024, 9, 16), '敬老の日'), (datetime.date(2024, 9, 22), '秋分の日'), (datetime.date(2024, 9, 23), '秋分の日 振替休日'), (datetime.date(2024, 10, 14), 'スポーツの日'), (datetime.date(2024, 11, 3), '文化の日'), (datetime.date(2024, 11, 4), '文化の日 振替休日'), (datetime.date(2024, 11, 23), '勤労感謝の日')]
こんな感じで、日本の祝日を一覧で取得可能です。何の日かもちゃんと書いてくれます。配列なので、
```
holiday=(jh.year_holidays(2024)[0])
print(holiday[0])
```
結果:2024-01-01
祝日を指定したり、その中の日付の情報を出すこともできます。
# 現在の日付から最も近い、次の祝日を出す
次の祝日がいつかを出します。もし今日が祝日であった場合でも、次の祝日を出すようにしています
```py
import datetime as dt
import jpholiday as jh
UTCtime=dt.datetime.now()
if UTCtime.hour>=15:
 
    jpdate=dt.datetime(UTCtime.year,UTCtime.month,UTCtime.day+1,UTCtime.hour-15,UTCtime.minute,UTCtime.second)
else:
    jpdate=dt.datetime(UTCtime.year,UTCtime.month,UTCtime.day,UTCtime.hour+9,UTCtime.minute,UTCtime.second)

answerholiday=jpdate
for holiday in jh.year_holidays(2024):
  if holiday[0].month>=jpdate.month and holiday[0].day>jpdate.day:
    answerholiday=holiday
    break
if answerholiday==jpdate:
  answerholiday=jh.year_holidays(2025)[0]
  print(answerholiday)
else:
  print(answerholiday[1])
```
こんな感じで作ってみました。今日の日付を取得→forで祝日が今日よりも遅い日付かどうかをひとつづつ確認→正しければ、それを出力。祝日が今年もうなかった場合は来年の元旦を出すといった感じです。
# 出てきた祝日と今日の日付の差を出す
```py
nextholiday=dt.datetime(answerholiday[0].year,answerholiday[0].month,answerholiday[0].day,0,0,0)
print(nextholiday)
differencetime=nextholiday-jpdate
print(differencetime)
```
先ほどのanswertimeを用いてnextholidayを作りました。また、differencetimeを作って現在時刻を引いています。差分は、引き算するだけで求められるそうです。そして、その答えをprintで出力してみました

# 完成形
```differencetime.py
# 22日成功パターン
import datetime as dt
import jpholiday as jh
UTCtime=dt.datetime.now()
if UTCtime.hour>=15:
 
    jpdate=dt.datetime(UTCtime.year,UTCtime.month,UTCtime.day+1,UTCtime.hour-15,UTCtime.minute,UTCtime.second)
else:
    jpdate=dt.datetime(UTCtime.year,UTCtime.month,UTCtime.day,UTCtime.hour+9,UTCtime.minute,UTCtime.second)

answerholiday=jpdate
for holiday in jh.year_holidays(2024):
  if holiday[0].month>=jpdate.month and holiday[0].day>jpdate.day:
    answerholiday=holiday
    break
if answerholiday==jpdate:
  answerholiday=jh.year_holidays(2025)[0]
 

nextholiday=dt.datetime(answerholiday[0].year,answerholiday[0].month,answerholiday[0].day,0,0,0)

differencetime=nextholiday-jpdate
print(differencetime)
```
differencetimeに、次の祝日までの残りが表示されました。
# まとめ
jhを使うことで日本の祝日を扱うことができる。datetime同士で引き算をすることで、差分を出すことが可能。
# 参考文献

https://note.nkmk.me/python-datetime-timedelta-measure-time/

https://zenn.dev/shiro_toy_box/articles/724a601b208398