2015年12月19日
8.朔日等の計算 その1(準備)
今まで述べてきたことにもとづいて、いざ具体的に、たとえば今日の暦要素を求めよ
うとすると、新月の日はいつか、あるいは二十四節気の日付はいつかがわからなければ話
にならない。つまり、これらの要素が求められなければ具体的に暦の要素を語ることはで
きないし、もちろん暦を構成することもできない。昨今、そのような情報を開示している
サイトはたくさんあるが、ここでは、それらの要素を自分で実際に計算する方法について
考察する。
8-1 ユリウス日(ユリウス通日、Julian Day)
ユリウス日は、ユリウス歴の紀元前4713年1月1日の正午(世界時)を元期とし、
日を単位として数えた数である。元期の日を0日目と数える。そんな古い頃からと疑問が
生じるかもしれないが、極端にいえば、4年に一度閏年を実施するというユリウス歴の運
用を、その時点まで機械的に適用したと仮定した場合の数である。正午が起点になってい
るのは天文学的伝統と言われている。このような通日を考えるのは、経過日数の計算その
他に極めて便利である。もちろん、小数部分もあり、その部分が時間経過に対応する。
ただ、すでにユリスウ日は整数部分が7ケタの数値となっており、扱いが便利とは言
えない。そこで、ユリウス日から 2400000.5 を差し引いた数値を考え、修正
ユリウス日(Modified Julian Day ; MJD と略す。)と呼ぶ。したがって、MJDは1858年
11月17日0時UTを元期とする(MJD=1)ということができる。
現行のグレゴリオ歴の年月日のデータから、次の式でMJDが計算できる。(フレーゲ
ルの公式と呼ばれている。)
MJD=[ 365.25 y ] + [ y / 400 ]- [ y / 100 ] + [ 30.59 (m-2) ] + d -678912
ここで[]はガウス関数で、[]内の数を超えない最大の整数を表す。
もちろん y:年、m:月、d:日 である。ただし1月、2月は前年の13月、14月として計算する。
ユリウス歴の場合は、最後の定数が 678914 となる。但し、ここでは述べないが、
紀元前の場合はまた式の形が異なる。当面、それほど昔にさかのぼる予定はないし、MJD
が分かれば、JDは簡単に計算できるので、変換式としてはこれで十分であろう。たとえば、
2015年9月25日のMJDは57290である。
話のついでに、マイクロソフトのエクセルでは、日付がシリアル値という数値で管理
されている。これも考え方としては同じものである。シリアル値の元期は、1900年1月1日
(この日のシリアル値が1になる)とされている。(ただし、Mac版のエクセルでは1904年から始まる。) 現在、このシリアル値とMJDとの差は15018である。しかし、1900年1月1日のMJDは
15020であり、シリアル値との差は15019となり、一つずれている。
この原因は、互換性確保のためと説明されているが、シリアル値では1900年2月29日が存在
するためである。(1900は100の倍数だが400の倍数ではないので、閏年ではない。)
MJDからシリアル値への変換を考える時、注意しなければならない点である。
敢えてシリアル値の事を述べたのは、エクセル限定の話ではあるが、例えば結果がJDや
MJDで得られた場合、そこから年月日や時間の情報を取り出す必要が生じる。そのために
はまたそれなりの関数等を用意する必要があるのだが、エクセルの使用を前提にすれば、
一度シリアル値に変換する事により、エクセル自体の持つ豊富な関数が使用できる事にな
る。(一例として、先にあげた2015年9月25日を考える。このMJDは57290であるが、
これと15018の差、つまり42272がシリアル値である。あとはエクセルで
Year(42272)=2015, Month(42272)=9, Day(42272)=25
が得られる。但し、シリアル値が負になると見事にエラーが返る。それが困る場合には
それについての対応が必要である。)
8-2 ユリウス日、修正ユリウス日の応用
[曜日(七曜)を求める]
子供の頃、自分の誕生日が何曜日だったのかを知りたくて、大変な計算をした記憶があ
る。MJDがあれば、7で割った余りを求めるだけで曜日がわかる。
例えば、Mod(57290,7)=2 であり、2015年9月25日は金曜日である。したがって
7で割った余りに対して
0→水、1→木、2→金、3→土、4→日、5→月、6→火
と対応させればよい。もし、日曜日を0に対応させるところから始めたければ、その分MJD
をシフトさせれば良い。つまり Mod(MJD+3,7) を求めれば望む対応が得られる。
[年の干支、日の干支]
あるページで、MJDから直接干支が求められる旨の記述があったが、これはあまりに乱
暴である。むしろ毎日に割り当てられる干支を求めるのにMJDは適している。しかし、年
の干支が求められないのかというと、決してそんなことはない。そのためには適当に起点
を決めるのが便利である。たとえば、1872年1月1日を起点にとる。この日のMJDは
4793 である。干支を求めたい年の1月1日のMJDを計算する。この差は日の単位であるか
ら、年の単位に直さなければならない。そのために閏年の事も考慮して
差/365.2422 を計算するのが基本である。ただし、一年が365日の年はこ
れでは1繰り上がらない。よって Int(差/365.2422+0.5) を計算
すればよい。(0.5に特に意味はない。)この値を12で割った余りを求める。これが
12支に対応する。たとえば、2015年の場合、MJD(2015,1,1)=57023 なので上式の値
は143となり、12で割った余りは11である。2015年は未年なので対応関係は、
申→0、酉→1、戌→2、亥→3、子→4、丑→5、寅→6、卯→7、辰→8
巳→9、午→10、未→11
となる。10干についても、10で割った余りを考察するだけで、考え方は同様である。
なお少し述べたとおり、日々の干支についてはMJDから直接求めることができる。この
際10干12支をばらばらに計算するのは面倒なので、少し大きくなるが、次の対応表を
準備しておくのが良い。
この対応表では、要素をずらすことをせず、甲子から癸亥が0から59に対応するよう
に配置した。そのため、MJDをシフトする必要がある。この表を使う前提で
干支= Mod ( MJD + 50 , 60 )
で求められる。この式は後に九星の計算が必要になった時、役に立つ。