GameSprit

自転車やMac・AppleScript、映画・小説やドラマのレビュー、備忘メモ・クイズなどを置いています。

AppleScript : 西暦年月日を与えて、曜日を得る(ツェラーの公式)

2013-01-06 08:57:58 | AppleScript
今回は、西暦の年月日を与えて、その日の曜日を計算してみます。

AppleScript : 曜日の変換 - GameSprit で、1~7 の数字を与えて、曜日を表示させるスクリプトを組みましたので、それを活用したいのです。


そんなに昔の日付を調べることは想定していませんので、グレゴリオ暦を対象にします。

グレゴリオ暦は、1年を365日とし、ただし、400年間に97回の閏年を入れその年を366日とすることによって、400年あたりの、1年の平均日数を365.2425日とするものです。西暦の年数が100で割り切れて、かつ400では割り切れない年は閏年としないというルールで対応しています。

400年 × 365日 + 97日 = 146,097日
146,097日 / 7日 = 20,871週/400年



グレゴリオ暦の西暦を与えて曜日を計算するには、ツェラーの公式(Zeller's congruence - Wikipedia, the free encyclopedia) というアルゴリズムを利用します。

ツェラーの公式の解説と検証は xawa雑記帳: ツェラーの公式:曜日を計算する と、【数の構成】「ツェラーの公式」を読み解く | 大人が学び直す数学 2 3 が詳しいです。


h:西暦の上2ケタ
y:西暦の下2ケタ
m:月
d:日

wd = (y+[y/4]+[h/4]-2h+[26(m+1)/10]+d) mod 7

ここで、[G] は、ガウスの記号で、Gを超えない最大の整数、つまり、G の整数部分を表します。
また、1月と2月はそれぞれ前年の13月と14月とします。

wd:0~6 が土曜日~金曜日に対応します。



例えば、2013年1月6日の場合、日曜日が導かれます。

(12+[12/4]+[20/4]-2*20+[26(m+1)/10]+d) mod 7
= (12 + 3 + 5 - 40 + [26*(13+1)/10])+6) mod 7
= (-20 + 36 + 6) mod 7
= 1



では、スクリプトを組んでみます。

まず、前回の曜日変換スクリプトの変更です。
「0~6」を与えて、「土曜日~金曜日」を得るようにします。





次に、西暦年月日から曜日計算を行ないます。1月あるいは2月の場合はそれぞれ前年の13月・14月とする部分、西暦年を上2ケタと下2ケタに分ける部分、ツェラーの公式部分で構成されています。





そして、完成版です。









キーワード:AppleScript曜日計算ツェラーの公式グレゴリオ暦閏年ガウス

最新の画像もっと見る

post a comment

ブログ作成者から承認されるまでコメントは反映されません。