春分/秋分の日を打開する 
2008/12/29 月曜日 12:17:56
カレンダーを作る際、春分/秋分の日が変動して計算が面倒です。
そんな春分/秋分の求め方は以下。
function getSpringHolyday($year){
if ($year <= 1947){
$ret = false;
}elseif ($year <= 1979){
$ret = floor(20.8357 + (0.242194 * ($year - 1980)) -
floor(($year - 1980) / 4));
}elseif ($year <= 2099){
$ret = floor(20.8431 + (0.242194 * ($year - 1980)) -
floor(($year - 1980) / 4));
}elseif ($year <= 2150){
$ret = floor(21.851 + (0.242194 * ($year - 1980)) -
floor(($year - 1980) / 4));
}else{
$ret = false;
}
return $ret;
}
function getAutumHolyday($year){
if ($year <= 1947){
$ret = 99;
}elseif ($year <= 1979){
$ret = floor(23.2588 + (0.242194 * ($year - 1980)) -
floor(($year - 1980) / 4));
}elseif ($year <= 2099){
$ret = floor(23.2488 + (0.242194 * ($year - 1980)) -
floor(($year - 1980) / 4));
}elseif ($year <= 2150){
$ret = floor(24.2488 + (0.242194 * ($year - 1980)) -
floor(($year - 1980) / 4));
}else{
$ret = 99;
}
return $ret;
}
20.8357とか、23.2588とか、0.242194とか、意味不明な数値が出てますが、
20.8357は、1980年の春分の日が、20日の20時14分4秒と発表されているので、そこから計算しているというわけです。23.2588も同様の考え方で・・。
0.242194は、1年365.242194日で扱われていたことから、差分として年数分計算してあげてます。
最後に、floor(($year - 1980) / 4)としているのは、閏年を考慮してます。
何分古いお話で、そんな感じで計算されてます。