第7回 日の干支
 前回は年の干支を求めました。しかし干支は日にもあります。たとえば2011年1月1日の干支は丙辰です。
 日付というのは暦法によって変わります。我々が使っているグレゴリオ暦での2011年1月1日は、昔のユリウス暦では2010年12月19日です(宗教的な理由などで今でもこれを使う国もあります)。また日本の「旧暦」ではこの日は11月27日です。しかし干支のほうは暦法に無関係で、かならず丙辰です。これは古代から連綿と「60日一巡」が続けられているためです。このため、日の干支は歴史上の記録を調べる時には有力な手懸りになります。暦法は国によってまた時代によって変わります。しかも昔は必ず「暦法どおり」の暦が行われたとは限らないのです。だからその日付は正確かどうかわからない。しかし干支がわかっていればそれがどの日なのかは確実になります。無論、60日の範囲内でしかわかりませんが、年、月などと総合すればある干支の日というのは特定できるわけです。

 そんなわけで、日の干支を求めてみましょう。このために便利なのは第5回で出てきた Date.parse() です。これは1970年1月1日0時からのミリ秒でした。だから
 Date.parse()/86400000
は1970年1月1日からの日数になるはずです。そこで次をやってみましょう。

Kanshi2_1.html
<html>
<head>
<title>暦計算 第7回、日の干支-1</title>
</head>
<body>
<script language="Javascript">
<!--
document.write(Date.parse('1970/1/1'),'<br>');
//-->
</script>
</body>
</html>

 しかし、この結果は

と、正確に0にはなりません。これは第6回で見たように日本のパソコンでは日本時を採用しているため、その”1970年1月1日0時”は世界時では”1969年12月31日15時”となるためです。だから '1970/1/1' の部分を '1970/1/1:9:0' としても良いのですが、ここでは Math.ceil(...) という関数を使いましょう。これは...の少数以下を切り上げる関数です。

Kanshi2_2.html
<html>
<head>
<title>暦計算 第7回、日の干支-2</title>
</head>
<body>
<script language="Javascript">
<!--
document.write(Math.ceil( Date.parse('1970/1/1') / 86400000 ),'<br>');
//-->
</script>
</body>
</html>

 この結果はたしかに0になります。

 ところで、1970年の最初の甲子の日は2月13日です。この日は1月1日から43日目ですから、
  ( Math.ceil( Date.parse( ymd ) / 86400000 ) - 43 ) % 60
とすれば ymd の日の干支番号が得られるはずです。

干支番号

 ただしここでも ( Math.ceil( Date.parse( ymd ) / 86400000 ) - 43 ) が負になるとまずいので、これから60日の倍数を遡ります。1年は365日ですが360日(=6×60)で近似するとして、3000年(≒360×3000=1080000日)も遡ればたいてい間に合います。
  43 - 1080000 = -1079957
 したがって、(最近3000年程度の)任意の日 ymd の干支番号は
  ( Math.ceil( Date.parse( ymd ) / 86400000 ) + 1079957 ) % 60
で求められます。そしてその日の干支は次のプログラムで求められます。

Kanshi2_3.html
<html>
<head>
<title>暦計算 第6回、日の干支</title>
</head>
<body>
<script language="Javascript">
<!--
Kan = new Array('甲','乙','丙','丁','戊','己','庚','辛','壬','癸');
Shi = new Array('子','丑','寅','卯','辰','巳','午','未','申','酉','戌','亥');
aday = 86400000;
d0 = 1079957;

ymd = '2011/1/1';
now = new Date(ymd);
kanshi = Math.ceil( Date.parse( ymd ) / aday ) + d0;
document.write(now.getYear(),':',
now.getMonth()+1,'月',
now.getDate(),'日:',
Kan[kanshi%10],Shi[kanshi%12],'<br>');
//-->
</script>
</body>
</html>

 ここでは、1日の長さ86400000ミリ秒を aday 、計算起点から1970年1月1日までの日数1079557日を d0 という変数に記憶させました。以降はこれらの変数を使うのが便利です。
 また、 Math.ceil( Date.parse( ymd ) / aday ) + d0 を kanshi という変数にしました。これで同じ計算を2度行う必要がなくなります。
 これを実行すると
 たしかにこの日の干支「丙辰」が表示されます。
はじめに戻る
第6回へ

May 2011

ご意見、ご感想
ザ・ランスのホームページ
旧暦と二十四節気のページ