全力で怠けたい

怠けるために全力を尽くしたいブログ。

祝日かどうかを判定する shukujitsu コマンドを使ってみたら便利だったのでメモ。

祝日かどうかを判定する shukujitsu コマンドを使ってみたら便利だったのでメモしておく。

shukujitsu コマンドのバージョン。

$ shukujitsu -version
shukujitsu 0.0.4

shukujitsu コマンドの使い方

shukujitsu コマンドは指定した日付が祝日かどうかを判定して結果を表示する。

大雑把な使い方だけど、指定した日付が祝日なら日付のあとになんの祝日なのかを表示して、指定した日付が祝日じゃなかったら日付だけを表示する。

$ shukujitsu -date 2021-01-01
2021-01-01 元日

$ shukujitsu -date 2021-01-02
2021-01-02

使い方の例だけど2021年1月の祝日はこんな感じでリストできる。

$ seq 1 31 | awk '{printf("2021-01-%02d\n", $1)}' | xargs -I{} shukujitsu -date {} | awk 'NF==2'
2021-01-01 元日
2021-01-11 成人の日

2021年6月の祝日をリストしたら何も表示しなかった。切ない。

$ seq 1 30 | awk '{printf("2021-06-%02d\n", $1)}' | xargs -I{} shukujitsu -date {} | awk 'NF==2'

インストール

Go 1.16 を使ってたら go install 〜 でインストールする。 go get 〜 でインストールでもいい。

$  go install github.com/soh335/shukujitsu/cmd/shukujitsu@latest

Go 1.15 を使ってたら go get 〜 でインストールする。

$ go get github.com/soh335/shukujitsu/cmd/shukujitsu

単に実行バイナリーだけがあればいいなら https://github.com/soh335/shukujitsu/releases からダウンロードする。

使い方

引数を指定しないときはシステム日付が祝日かどうか判定する。

$ date "+%Y-%m-%d"
2021-03-14

$ shukujitsu
2021-03-14

-date オプションで祝日かどうか判定する日付を指定する。 -date オプションは日付を Go の 2006-01-02 のフォーマットつまり YYYY-MM-DD みたいに指定する。

$ shukujitsu -date 2021-01-01
2021-01-01 元日

$ shukujitsu -date 2021-01-02
2021-01-02

-quiet オプションを指定すると祝日かどうかの判定結果を表示しない。

-quiet オプションは判定結果を表示する必要がなくて shukujitsu コマンドの終了ステータスをチェックするときに使う感じ、というかたぶんこちらがよく使いそう。 shukujitsu コマンドの終了ステータスはこのあと記載していく。

$ shukujitsu -quiet
$ shukujitsu -date 2021-01-01 -quiet
$ shukujitsu -date 2021-01-02 -quiet

shukujitsu コマンドの終了ステータス

終了ステータス 意味
0 祝日
1 祝日じゃない
2 日付のパースエラー

cron と shukujitsu コマンドを組み合わせて使う

cron で 0 0 * * MON-FRI shukujitsu || echo '祝日じゃない' みたいにやると祝日じゃない平日だけ特定の処理を実行したりできて便利。

特定の日付が祝日かどうか判定する仕組み

shukujitsu コマンドは内閣府祝日の csv ファイル を公開しているのを利用している。

shukujitsu コマンドは前述の csv ファイルから祝日の定義を取り出してプログラムの中に取り込んでいる。

現時点での最新バージョンの 0.0.4 は 1955/1/1 元旦から 2022/11/23 勤労感謝までの祝日に対応しているよう。

ライブラリーとしても使える

shukujitsu コマンドはライブラリーとしても使えるというかもともとは Go で任意の日付が祝日か判定するためのライブラリーだったりする。

ライブラリーとして使うときはこんな感じで任意の日付が祝日かどうか判定できる。

if shukujitsu.IsShukujitsu(time.Now()) {
    fmt.Println("shukujitsu!")
}

参考サイト