#!/usr/bin/perl # jd -- program to compute Julian day number from a Gregorian # calendar date and vice versa # # Leif.Harcke@jpl.nasa.gov # March 1997 @days = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat'); %months = ('Jan',1,'Feb',2,'Mar',3,'Apr',4,'May',5,'Jun',6, 'Jul',7,'Aug',8,'Sep',9,'Oct',10,'Nov',11,'Dec',12); @months = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep', 'Oct','Nov','Dec'); if (!((scalar(@ARGV) == 1) || (scalar(@ARGV) == 3))) { die "usage: jd JD | [-]YYYY MMM DD\n"; } if (scalar(@ARGV) == 3) { $monthname = substr($ARGV[1],0,3); $monthname =~ tr/A-Z/a-z/; substr($monthname,0,1) =~ tr/a-z/A-Z/; $m = $months{$monthname} || die "Invalid month: $ARGV[1]\n"; $y = $ARGV[0]; $d = $ARGV[2]; if ($m <= 2) { $y -= 1; $m += 12; } $a = int($y/100); $b = 2 - $a + int($a/4); $jd = int(365.25 * ($y + 4716)) + int(30.6001 * ($m + 1)) + $d + $b - 1524.5; $dow_m = (($jd + 1.5) % 7) + 1; print "Meeus: JD$jd\n"; $y = $ARGV[0]; $m = $months{$monthname}; $d = $ARGV[2]; $jd = int((1461*($y+4800+int(($m-14)/12)))/4) + int((367*($m-2-12*int(($m-14)/12)))/12) -int((3*(int(($y+4900+int(($m-14)/12))/100)))/4) + $d - 32075; $dow_f = $jd - 7*int(($jd+1)/7)+2; print "Fliegel: JD$jd\n"; # Hatcher $Y = $ARGV[0]; $M = $months{$monthname}; $D = $ARGV[2]; $J1 = 1721426; $y = 4716; $m = 3; $n = 12; $r = 4; $p = 1461; $q = 0; $v = 3; $u = 5; $s = 153; $t = 2; $w = 2; $Y_p = $Y + $y - int(($n + $m -1 -$M)/$n); $g = int(int(($Y_p + 184)/100) * 3/4) -38; $j = 1401 + $g; $M_p = ($M - $m) % $n; $D_p = $D - 1; $J = int(($p*$Y_p + $q)/$r) + int(($s*$M_p + $t)/$u) + $D_p - $j; print "Hatcher: JD$J\n"; print "DOW Meeus: $days[$dow_m-1]\n"; print "DOW Fliegel: $days[$dow_f-1]\n"; } else { $jd = $ARGV[0]; $z = int($jd + 0.5); $f = ($jd + 0.5) - $z; if ($z < 2299161) { $a = $z; $calendar = "Julian"; } else { $alpha = int(($z - 1867216.25)/36524.25); $a = $z + 1 + $alpha - int($alpha/4); $calendar = "Gregorian"; } $b = $a + 1524; $c = int(($b - 122.1)/365.25); $d = int(365.25*$c); $e = int(($b-$d)/30.6001); $d = $b - $d - int(30.6001*$e) + $f; if ($e < 14) { $m = $e -1; } else { $m = $e - 13; } if ($m > 2) { $y = $c - 4716; } else { $y = $c - 4715; } $sec = int(86400*$f); $sec_f = 86400*$f - $sec; $hour = int($sec/3600); $sec = $sec - 3600*$hour; $min = int($sec/60); $sec = int($sec - 60*$min); $time = sprintf("%02d:%02d:%02d",$hour,$min,$sec); print "Meeus: $y $months[$m-1] $d $calendar\n"; print "Meeus: $time\n"; $l = $jd + 68569; $n = int((4*$l)/146097); $l = $l - int((146097*$n + 3)/4); $i = int((4000*($l+1))/1461001); $l = $l - int((1461*$i)/4) + 31; $j = int((80*$l)/2447); $d = $l - int((2447*$j)/80); $l = int($j/11); $m = $j + 2 -12*$l; $y = 100*($n-49)+$i+$l; print "Fliegel: $y $months[$m-1] $d Gregorian\n"; $J1 = 1721426; $y = 4716; $m = 3; $n = 12; $r = 4; $p = 1461; $q = 0; $v = 3; $u = 5; $s = 153; $t = 2; $w = 2; $J = $jd; $g = int(int(($J + 68569)/36524.5) * 3/4) - 38; $j = 1401 + $g; $J_p = $J + $j; $Y_p = int(($r*$J_p + $v)/$p); $T_p = int((($r*$J_p + $v) % $p)/$r); $M_p = int(($u*$T_p + $w)/$s); $D_p = int((($u*$T_p + $w) % $s)/$u); $D = $D_p + 1; $M = ($M_p + $m - 1) % $n + 1; $Y = $Y_p - $y + int(($n + $m - 1 - $M)/$n); print "Hatcher: $Y $months[$M-1] $D Gregorian\n"; $j = $jd + 1402; $k = int(($j - 1)/1461); $l = $j - 1461 * $k; $n = int(($l-1)/365) - int($l/1461); $i = $l - 365*$n + 30; $j = int((80*$i)/2447); $d = $i - int((2447*$j)/80); $i = int($j/11); $m = $j + 2 -12*$i; $y = 4*$k + $n + $i - 4716; print "Fliegel: $y $months[$m-1] $d Julian\n"; }