春分の日は今年は3月20日でしたが年によって変わります。
これを計算で求める方法があります。
春分の日 – Wikipedia
1900年から2099年までの求め方が載っています。
これをJavaScriptで書くと次のようになります。
function shunbun(y){
if(y<1900||y>2099)return;
switch(y%4){
case 0:
if(y<=1956)return 21;
if(y<=2088)return 20;
return 19;
case 1:
if(y<=1989)return 21;
return 20;
case 2:
if(y<=2022)return 21;
return 20;
case 3:
if(y<=1923)return 22;
if(y<=2055)return 21;
return 20;
}
}
if(y<1900||y>2099)return;
switch(y%4){
case 0:
if(y<=1956)return 21;
if(y<=2088)return 20;
return 19;
case 1:
if(y<=1989)return 21;
return 20;
case 2:
if(y<=2022)return 21;
return 20;
case 3:
if(y<=1923)return 22;
if(y<=2055)return 21;
return 20;
}
}
ちょっと長いので、もっと短い方法を考えます。
国立天文台が作っている「歴要項」というものがあります。
暦要項 PDF版 一覧
これを見ると春分の日の中央標準時が分かります。
2000年の場合、3月20日16時35分です。
この中央標準時が翌年以降、3月の何日になるかを考えます。
地球の公転周期は365.242190402日です。
つまり毎年、中央標準時が0.242190402日(5時間48分45秒に相当)ずつ遅くなります。
2000年は20日16時35分でしたが、2001年は20日22時23分、2002年は翌日の21日4時12分となります。
どんどん日が後ろにずれていくのですが、閏年には1日戻りますので、20日から22日までの間に収まるというわけです。
これをJavaScriptで表わすと次の通りです。2000年から2099年までに対応します。
「20.6910」というのは上述の「20日16時35分」に相当します。
function shunbun_easy(y){
if(y<2000||y>2099)return;
var x=y-2000;
return Math.floor(20.6910+0.242190402*x-Math.floor(x/4))
}
if(y<2000||y>2099)return;
var x=y-2000;
return Math.floor(20.6910+0.242190402*x-Math.floor(x/4))
}
秋分の日については次の通りです。
function shubun(y){
if(y<1900||y>2099)return;
switch(y%4){
case 0:
if(y<=2008)return 23;
return 22;
case 1:
if(y<=1917)return 24;
if(y<=2041)return 23;
return 22;
case 2:
if(y<=1946)return 24;
if(y<=2074)return 23;
return 22;
case 3:
if(y<=1979)return 24;
return 23;
}
}
if(y<1900||y>2099)return;
switch(y%4){
case 0:
if(y<=2008)return 23;
return 22;
case 1:
if(y<=1917)return 24;
if(y<=2041)return 23;
return 22;
case 2:
if(y<=1946)return 24;
if(y<=2074)return 23;
return 22;
case 3:
if(y<=1979)return 24;
return 23;
}
}
同じく、簡易な式は次の通りです。
「23.09」のところは正しくは「23.1028」(23日2時28分に相当)なのですが、2012年などで、微妙なところで翌日になってしまう「誤差」があります。そこで便宜的に少し早めて「23.09」としています。
function shubun_easy(y){
if(y<2000||y>2099)return;
var x=y-2000;
return Math.floor(23.09+0.242190402*x-Math.floor(x/4))
}
if(y<2000||y>2099)return;
var x=y-2000;
return Math.floor(23.09+0.242190402*x-Math.floor(x/4))
}
コメント