春分の日、秋分の日を求める関数

春分の日は今年は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;
  }
}

ちょっと長いので、もっと短い方法を考えます。
国立天文台が作っている「歴要項」というものがあります。
暦要項 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))
}

秋分の日については次の通りです。

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;
  }
}

同じく、簡易な式は次の通りです。
「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))
}


タグ

カテゴリー

最近の投稿

最近のコメント

固定ページ

アーカイブ

stabucky

写真

メタ情報