[真理子日曜学校]
 

ユリウス通日

 

 
  1. ユリウス通日とは?
     私たちが慣れ親しんでいるカレンダーの日付のデータ形式は、年・月・日という3つの「桁」からなるうえ、各桁の桁上がりの方法がまちまちで複雑なので、「2010年4月4日は2009年12月25日から何日後か」とか、「2010年4月4日から40日前は何日か」、「2010年1月6日は何曜日か」などという単純な計算すら、かなり面倒になってしまいます。カレンダーを作るときにはこれらの計算が頻繁に出てくるので、日数計算が足し算や引き算だけででき、7で割った余りを求めれば簡単に曜日がわかるような形に、日付を変換しておくと便利です。そのためには、ある一定の日を決めて、そこから通算で何日後であるかという形で日付を表すのがいいでしょう。しかも、マイナスが出てくると計算が面倒なので、その一定の日はできるだけ昔にしたほうが便利ですが、だからといって何百万年前などというのも非現実的です。
     天文学や年代学では、このための通算日として、紀元前4713年1月1日正午からの通算日を用いることが多く行われています。これを「ユリウス通日」とか「ユリウス日」と言います。
     旧約聖書によってたんねんに計算すると、天地創造は紀元前3761年10月7日に行われたらしいので、紀元前4713年からの通日を求めれば、まずたいていの用途は事足りることでしょう(もっとも、七十人訳聖書はかなり水増しをしているので、それで計算すると紀元前5507年になってしまい、ビザンティン帝国ではこの年を紀元としています)。
     ユリウス通日は正午を起点にしているために、ある日のユリウス通日を求めると末尾に.5という値がついてしまいますので、通日計算をするだけだったら0.5を足して、紀元前4713年1月1日午前0時を起点とする形にしたほうが便利です。当サイトの計算ではこの値を用いています(その前日が当サイト風ユリウス通日の0になります)。
     こんなに昔を起点にすると、最近の日付のユリウス通日はとても大きな数になってしまうので、最近の日付を計算するときは、ユリウス通日から240000.5を引いた「修正ユリウス通日」を使うことも多いです。当サイト風ユリウス通日からは2400001を引くことになります。これは紀元1858年11月17日からの通日になります。

  2.  
     
  3. 曜日を求める
     当サイトのユリウス通日を7で割った余りが曜日になります。余りが0のときは月曜日、1が火曜日、2が水曜日、3が木曜日、4が金曜日、5が土曜日、6が日曜日となります。

  4.  
     
  5. 暦について
     現行の暦は1582年10月15日から用いられており、この暦を定めた教皇グレゴリオ13世にちなんでグレゴリオ暦と言います。もっともこの時代はすでに宗教改革後で、プロテスタント国ではカトリックへの反発からこの暦の採用が遅れていますが、面倒なのでここでは世界一律に1582年10月15日がグレゴリオ暦ということにします。グレゴリオ暦では1年は平年の場合365日であり、4で割り切れる年のみ「うるう年」として2月を29日までとし1年を366日とします。ただし100で割り切れる年については、400で割り切れる年(1600年、2000年、2400年など)はうるう年とし、その他(1900年、2100年など)は平年とします。
     グレゴリオ暦が用いられる前はユリウス暦と言い、4で割り切れる年を必ずうるう年とします。1582年10月15日(金)の前日は1582年10月4日(木)です。グレゴリオ暦実施にあたっては10日分ずらしたわけですね。曜日はずらさないわけですが、ちょうどこの時期は日本にカトリックの布教が始まったころなので、日本では混乱があって、曜日までずらすと解釈して、ミサを変な曜日に実施した教会もあったようです。
     ユリウス暦の命名の由来は、この暦法を定めたローマの実質的初代皇帝であるJulius Caesar(真理子はラテン語をイタリア語風に読むのでユリウス・チェザルですが、一般的にはユリウス・カエサルですね)から来ています(なお、ユリウス通日のほうはユリウス通日@Wikipediaを見ると違うようです)。チェザル以前はさまざまなれ貴方が用いられていますが、暦法計算のときには一律にユリウス暦だったと仮定して計算します。
     暦では0年というのがないので、紀元1年の前年は紀元前1年になりますが、これでは面倒なので、天文学では紀元前1年を0年、紀元前2年を-1年と言います。よって、紀元前に関しては天文学と年代学で言い方が異なります。紀元前600年のつもりで-600と書くと、それは天文学での表記になって、本来なら間違いになります。もっとも次で紹介するプログラムでは、紀元前600年のつもりで-600と書いてもらうわけですから、便法としてそのように書くのはかまわないと思いますが、混乱のもとにならないようにしてください。

  6.  
     
  7. ユリウス通日の計算法
     当サイトのユリウス通日を求めるサブルーチン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);
    }
    

  8.