曜日の判断(ツェラーの公式)

シェル内で曜日の判断をしたかったのでZellerの公式を書き下した。

参考:wikipedia:ツェラーの公式

zeller.sh

#!/bin/sh
#
# Zeller's congruence
#

test $# -ne 3 && exit 1

year1=`expr $1 / 100`
year2=`expr $1 % 100`
month=$2
day=$3

t1=`expr \( $month + 1 \) \* 26 / 10`
t2=`expr $year2 / 4`
t3=`expr $year1 / 4`

expr \( $day + $t1 + $year2 + $t2 + $t3 + 5 \* $year1 \) % 7

使い方:

$ ./zeller.sh 2009 04 16
5
|sh|<
0が土曜、1が日曜、…、6が金曜。最後の式が
>||
expr \( $day + $t1 + $year2 + $t2 + $t3 - 2 \* $year1 \) % 7

ではなく

expr \( $day + $t1 + $year2 + $t2 + $t3 + 5 \* $year1 \) % 7

なのは値がマイナスになるのを防ぐため。mod 7なので "-2 * $year1" と "+5 * $year1"は同値になる。