今回は、西暦の年月日を与えて、その日の曜日を計算してみます。
AppleScript : 曜日の変換 - GameSprit で、1~7 の数字を与えて、曜日を表示させるスクリプトを組みましたので、それを活用したいのです。
そんなに昔の日付を調べることは想定していませんので、グレゴリオ暦を対象にします。
グレゴリオ暦は、1年を365日とし、ただし、400年間に97回の閏年を入れその年を366日とすることによって、400年あたりの、1年の平均日数を365.2425日とするものです。西暦の年数が100で割り切れて、かつ400では割り切れない年は閏年としないというルールで対応しています。
グレゴリオ暦の西暦を与えて曜日を計算するには、ツェラーの公式(Zeller's congruence - Wikipedia, the free encyclopedia) というアルゴリズムを利用します。
ツェラーの公式の解説と検証は xawa雑記帳: ツェラーの公式:曜日を計算する と、【数の構成】「ツェラーの公式」を読み解く | 大人が学び直す数学 2 3 が詳しいです。
例えば、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、曜日計算、ツェラーの公式、グレゴリオ暦、閏年、ガウス
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、曜日計算、ツェラーの公式、グレゴリオ暦、閏年、ガウス