〜 タイム 〜
閏年の判定

閏年とは「4年に1度訪れる太陽暦において平年より暦日が1日多い年のこと」はご存じかと思いますが、
4年に一度必ず来るものではないことをご存じですか?
古代エジプトより1年を365日としていましたが、
閏年が存在しなかったために4.129年に1日の割合で暦と季節にズレが生じていました。
その後、古代ローマで採用されたユリウス暦で、4年に1度を閏年と定めることでズレを抑えたのですが、
約128年に1日の割合で同様に暦と季節がズレ、後になればなるほど大きく違ってしまいました。
そこでグレゴリウス13世が暦の研究をし、以下の閏年条件を設けたグレゴリオ暦を制定しました。
・4で割り切れる ・100で割り切れない ・100で割れても400で割り切れる
上記条件より1暦年は「年+(年÷4)−(年÷100)+(年÷400)」。 言い換えると、「365日+(1/4)+(1/100)+(1/400)」で1年=365.2425日ですが 昔と違って今では1年=365.2422日ともう少し精密な周期がわかっており、 グレゴリオ暦と0.0003日(25.92秒)ずつズレてしまいます。 そのため約3300年に累積誤差で丸1日分ズレてしまうわけで、 この閏年とその条件が、これから先いつまで続くのかわかりませんがまだしばらくは使えることでしょう。 尚、他のページで行っている閏年判定は、下記のモジュール命令ではなくマクロにしています。 HSP3においては、モジュールでもマクロでもどちらでも使用できますが、 HSP2では文字列内で計算させることができませんので、マクロにしても使用できません。 手間ですが、一旦変数に代入した後、文字列へ渡すようにしてください。

leapcheck 対象年
対象年閏年かの判定をする年を指定する。
対象(=1)か否(=0)かはstatに返る。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#module
#deffunc leapcheck int
	mref year, 0
	mref stt, 64
	stt =  (year \ 400 = 0) | (year \ 4 = 0 & (year \ 100 ! 0))
	return
#global

	sdim leap, 8, 2
	y = 1900, 2000, 2008, 2100, 2400
	leap = "平年", "閏年"
	repeat 5
		leapcheck y.cnt
		mes "西暦" + y.cnt + "年は" + leap.stat + "です。"
	loop
	stop

判定結果 = leapcheck(対象年)
判定結果対象(=1)か否(=0)かの判定結果受取先を指定する。
対象年閏年かの判定をする年を指定する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#module
#defcfunc leapcheck int year
	return (year \ 400 = 0) | (year \ 4 = 0 & year \ 100 ! 0)
#global

	y = 1900, 2000, 2008, 2100, 2400
	leap = "平年", "閏年"
	foreach y
		mes "西暦" + y.cnt + "年は" + leap(leapcheck(y.cnt)) + "です。"
	loop