ユリウス通日の計算法
当サイトのユリウス通日を求めるサブルーチンjul2d(日付)および、ユリウス通日から日付を求めるサブルーチンd2jul(ユリウス通日)です。日付の書式はyyyymmddd、つまり年4桁、月2桁、日2桁で、桁が満たない場合は頭に0をつけてください。たとえば2010年4月5日ならば20100405とします。紀元前の場合はこの前にマイナスをつけます。たとえば紀元前600年2月14日は-06000214とします。
以下、この2つのサブルーチンおよび、テスト用プログラムを示します。テスト用プログラムではいくつかの日付を与えて、ユリウス通日、修正ユリウス通日を計算し、さらにこの計算されたユリウス通日から逆に日付を計算して表示し、末尾に曜日を表示します。print &jul(-4713,1,1);
print &jul(-3761,10,7);
print &jul(-1,12,31);
print &jul(1,1,1);
print &jul(1582,10,4);
print &jul(1582,10,15);
print &jul(1858,11,17);
print &jul(2010,3,28);
print &jul(2010,3,29);
print &jul(2010,3,30);
print &jul(2010,3,31);
print &jul(2010,4,1);
print &jul(2010,4,2);
print &jul(2010,4,3);
print &jul(2010,4,4);
exit;
sub jul {
local ($y,$m,$d)=@_;
local $jd,$mjd,$yb,$dt;
if($y<0) {
$jd=&d2jul("-" . sprintf("%04d%02d%02d",abs($y),$m,$d));
} else {
$jd=&d2jul(sprintf("%04d%02d%02d",$y,$m,$d));
}
$mjd=$jd-2400001;
$yb=("Mon","Tue","Wed","Thu","Fri","Sat","Sun")[$jd%7];
$dt=&jul2d($jd);
return "$y/$m/$d\tJD=$jd\tMJD=$mjd\t$dt($yb)\n";
}
sub d2jul {
local $y,$m,$d,$jd,$st;
if(substr($_[0],0,1) eq '-') {
$y=substr($_[0],0,5);
$m=substr($_[0],5,2);
$d=substr($_[0],7,2);
} else {
$y=substr($_[0],0,4);
$m=substr($_[0],4,2);
$d=substr($_[0],6,2);
}
if($y>1582 || ($y==1582 && $m>10) || ($y==1582 && $m==10 && $d>=15)) {
if($m<3) { $m+=12; $y--; }
$jd=int(365.25*$y)+int($y/400)-int($y/100)+int(30.59*($m-2))+$d+1721089;
} else {
if($m<3) { $m+=12; $y--; }
if($y<0) {
$jd=int(365.25*$y-0.75)+int(30.59*($m-2))+$d+366+1721087;
} else {
$jd=int(365.25*$y)+int(30.59*($m-2))+$d+1721087;
}
}
return $jd;
}
sub jul2d {
local $jd=pop(@_);
local $y,$m,$d,$s,$t;
if($jd>=2299161) {
$t=int(($jd-1867216.25)/365.2425);
$jd += 1 + int($t / 100) - int($t / 400);
}
$jd+=1524;
$y=int(($jd-122.1)/365.25);
$jd-=int(365.25*$y);
$m=int($jd/30.6001);
$jd-=int(30.6001*$m);
$m--;
$y-=4716;
if($m>12) { $m-=12; $y++; }
if($y<=0) { $y--; $s="-"; } else { $s=""; }
return sprintf("$s%04d%02d%02d",abs($y),$m,$d);
}