でぐちやドットコム技術ブログ

でぐちやドットコムの技術系ブログです。

[bash] ツェラーの公式で曜日を求めるスクリプト

bashで曜日を求めたい場合、ツェラーの公式を利用すれば求められます。

昨年末に作成したプログラムで必要だったのでスクリプトを書いていたのですが、今年に入ってからそのスクリプトが求めている曜日が間違っていることに気づきました。個人的に使っているスクリプトでまあ間違っていても大した影響はないのですが、原因を調べてみると、私のツェラーの公式の理解が間違っていました。

1月と2月の曜日を求めるときだけは、前年の13月、14月として扱って計算しなければならないそうです。
なので、2018年1月22日の曜日を求めたい場合は、2017年13月22日として計算する必要があります。
その処理を入れてやれば期待通りの動きができました。

以下は、前日の曜日を求めるためのスクリプトです。

#!/bin/sh

YESTERDAY=`env TZ=JST+15 date +%Y%m%d`
echo 日付:$YESTERDAY

h=`expr ${YESTERDAY:0:4} / 100`
y=`expr ${YESTERDAY:0:4} % 100`
m=${YESTERDAY:4:2}
d=${YESTERDAY:6:2}

# 1月、2月は前年の13月、14月として扱う
if [ "$m" = "01" ]; then
    m="13";
    y=`expr $y - 1`;
elif [ "$m" = "02" ]; then
    m="14";
    y=`expr $y - 1`;
fi

t1=`expr \( $m + 1 \) \* 13 / 5`
t2=`expr $y / 4`
t3=`expr $h / 4`

yobi=`expr \( $y + $t2 + $t3 - 2 \* $h + $t1 + $d \) % 7`

declare -a array=("SAT" "SUN" "MON" "TUE" "WED" "THU" "FRI")
echo ${array[${yobi}]};

1月2月の場合の処理だけ結構適当なので動かなくなるパターンもあるのですが、しばらくは大丈夫なのでこのまま使いたいと思います。

Wikiを参考にしました。 ツェラーの公式 - Wikipedia