はい。電算室です。今日は何が起きるのでしょうか。
曜日によって処理するJOBを変えることはよくあります。
また、土日や祝日の場合は処理をしないように設定することもよくあります。
と、いうことはシステム日付を取得し、それが何曜日かを知る必要がありますが、それはプログラムによって何曜日かを知ることができるのです。
その方法は、ツェラー(Zeller)の公式を使います・・・。
[1回]
ツェラー(Zeller)の公式は、
W = (Y+int(Y/4)-int(Y/100)+int(Y/400)+int(2.6*M+1.6)+D) % 7
という一つの式で表されます。
西暦Y年M月D日の曜日W として、
曜日は、W = 0:日 1:月 2:火 3:水 4:木 5:金 6:土
となるのです。ちなみに、%7 とは、7で割った余りの数ということです。
ただし、1月と2月は前年の13月、14月として計算します。
ちょっとやってみましょうか。(intは整数値)
例えば、2007年7月16日は・・・
(2007 + int(2007/4) -int(2007/100) +int(2007/400) +int(2.6*7 + 1.6) + 16)
=2007 + 501 - 20 + 5 + 19 + 16
=2528
で、
2528 ÷7 = 361.14285≒361余り1
ということで、余り1=月曜日 となります。
カレンダーを見て確かめてみましょう。
と、いうことで、コンピュータのシステム日付さえ間違えていなければ、本日は何曜日かを算出し、今日は処理する、しないを判断つけられるのです。
が・・・
先程求めた7月16日・・・。えぇ。海の日で休みでした。
通常祝日は決まった日ですが、
成人の日 1月の第2月曜日
海の日 7月の第3月曜日
敬老の日 9月の第3月曜日
体育の日は10月の第2月曜日
と、いうようにハッピーマンデーということで決まった日にできません。
あと、秋分の日、春分の日もそうですね。
これもまたプログラムで判断させるのですが・・・。
誰が組んだか知りませんが、私の会社のシステムのプログラム、間違っていました(。、)シクシク..
7月16日を休みとせずに、7月23日を休みとしてしまったのです。
先程曜日を求めた上に、何日かの範囲の間であれば休みとするという考え方。
例えば、7月、9月で、月曜日でかつ15日以上21日以下であれば休みとします。
これが、16日より大きく、24日より小さいと組まれていたのです!!
誰が組みやがった(-_-#)
おかげで、23日に処理されるはずのバッチが流れずあわてて手動で流したものの、流し漏れがあり冷や汗ものでした (ノ><)ノ ひいぃぃ~や
何日から何日の間という考え方が難しいのであれば、日を7で割り、小数点以下を切り上げた値が、第何週という考え方でもいいのです。
ロジック的(cobol)にはこうなります。
M 月
DD 日
W 曜日 (先程のツェラーの公式で算出済み)
X 第何週
X = D / 7 + 0.9 0.9で少数点以下切り上げ
IF M = 1 OR 10 AND W = 1 AND X = 2
→休み
IF M = 7 OR 9 AND W = 1 AND X = 3
→休み
そういえば、11月23日をハッピーマンデーにしようという動きがあったようですが、連休になるのはうれしいのですが、システム屋からすると
ありがた迷惑です(-_-#)
まぁ、その日は皇室の大事な祭事(新嘗祭)があるので流れましたが。
ちなみに、春分の日、秋分の日は別の計算式によります。
それはまた後日。
PR