Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

bashで祝日を含めた休日の判定

More than 1 year has passed since last update.

目的 : bashを用いて祝日を含めた休日の判定をする

シェルなどを平日のみ動作させたい、祝日を含めて休日のみ動作させたい場合、
土曜日・日曜日だけでなく、祝日も考慮する必要があります。
本記事は、そのケースの実現方法の説明です。

環境

  • Linux
  • bash

祝日の一覧を入手する

祝日の一覧は、内閣府が公開しています。

https://www8.cao.go.jp/chosei/shukujitsu/gaiyou.html

祝日の一覧を記述したcsvファイルが公開されていますが、
2020年2月29日現在、2021年までしか記述されていません。

そのため、下記を使用します。

holiday-jp様のリポジトリ
https://github.com/holiday-jp/holiday_jp/blob/master/holidays.yml

...
2019-11-03: 文化の日
2019-11-04: 文化の日 振替休日
2019-11-23: 勤労感謝の日
2020-01-01: 元日
2020-01-13: 成人の日
2020-02-11: 建国記念の日
2020-02-23: 天皇誕生日
2020-02-24: 天皇誕生日 振替休日
...

ここでは、上記のyml形式のファイルを使用しましたが、他プログラミング言語用のモジュールもあるので、
他環境で使用したい場合は、上記のリポジトリを探してみてください。

祝日を随時更新して休日判定する場合

祝日は変更になることがある(最近だと天皇誕生日の祝日の変更など)ので、
下記のcurlコマンドをcrontabなどで定期的に実行することで、自動的にダウンロードします。

# "トークン"の箇所に、OAuthTokenを入力
curl -H 'Authorization: token トークン' -H 'Accept: application/vnd.github.v3.raw' -L https://api.github.com/repos/holiday-jp/holiday_jp/contents/holidays.yml > holidays.yml

なお、下記が満たされていることが前提です。

  • 休日判定する環境がインターネット接続可能であること
  • GitHubのリポジトリが最新の祝日一覧に更新されていること
  • GitHubのアカウントを作成済みで、OAuthTokenを発行していること

OAuthTokenは、
1. Personal Access Tokens にアクセス
2. Generate new tokenをクリック
3. Noteに任意の文字列を入力
4. public_repoにチェック
5. Generate tokenをクリック
で作成できます。

祝日を随時更新せずに休日判定する場合

holiday-jp様のリポジトリから祝日の一覧のファイル(holidays.yml)をダウンロードし、使用します。
こちらは、休日判定する環境がインターネット接続不可でも構いません。

注意点
祝日に変更があった場合、再度祝日の一覧ファイルをダウンロードする必要があります。

休日を判定する

ここでは、シェルを実行する際に日付の引数を取り、休日の判定結果(と祝日の場合は祝日名)を返す形としました。

example.sh
#!/bin/bash

#祝日の一覧を記述しているファイル
PUBLIC_HOLIDAY_LIST='./holidays.yml'
#休日、祝日を判定する対象の日付
target_date=$(/bin/date +"%Y-%m-%d" -d $1)

#祝日の場合
if [ -n "$(/bin/grep $target_date $PUBLIC_HOLIDAY_LIST)" ] ; then
    #祝日名を取得
    public_holiday_name=$(/bin/grep $target_date $PUBLIC_HOLIDAY_LIST | /bin/awk -F ':' '{print $2}')
    echo "$target_date は祝日:$public_holiday_name です."
#休日(土曜日,日曜日)の場合
elif [ -n "$(/bin/date -d $target_date | /bin/grep -E "[土日]曜日")" ] ; then
    #曜日を取得
    day_of_the_week=$(/bin/date -d $target_date | /bin/awk '{print $4}')
    echo "$target_date$day_of_the_weekです."
#平日の場合
else
    echo "$target_date は平日です."
fi
result
$ ./holiday.sh 2020-01-13
2020-01-13 は祝日: 成人の日 です.
$ ./holiday.sh 20200113
2020-01-13 は祝日: 成人の日 です.
$ ./holiday.sh 20200114
2020-01-14 は平日です.
$ ./holiday.sh 20200112
2020-01-12 は日曜日です.
$ ./holiday.sh 20200211
2020-02-11 は祝日: 建国記念の日 です.

おまけ : 独自の祝日を判定したい場合

一般的な祝日の一覧ファイルとは別に、以下の形式で記述し、if文を変更すればOK

2020-01-14: 大事な記念日
2020-02-05: 重要な記念日

original.sh
#祝日の一覧を記述しているファイル
PUBLIC_HOLIDAY_LIST='./public_holidays.yml'
#独自の祝日を記述しているファイル
ORIGINAL_HOLIDAY_LIST='./original_holidays.yml'
#休日、祝日を判定する対象の日付
target_date=$(/bin/date +"%Y-%m-%d" -d $1)

#祝日の場合
#if [ -n "$(/bin/grep $target_date $PUBLIC_HOLIDAY_LIST)" ] ; then
if [ -n "$(/bin/grep $target_date $PUBLIC_HOLIDAY_LIST)" ] || [ -n "$(/bin/grep $target_date $ORIGINAL_HOLIDAY_LIST)" ] ; then
# ...
fi
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away