玄関コンピュータの部屋各種解説コーナー電脳豆知識

○年月日と通算日数の相互変換

西暦2000年問題に関連して、年月日と通算日数を相互変換する方法を紹介しましょう。 例えば自分が生まれてから正確に何日たったか知りたい時のように、ある年月日からある年月日までの正確な日数を知りたいことがあります。 そのために、西暦年月日をある時点を基点とした通算日数に変換する方法が色々と考案されています。

天文学分野では、フランスの古典学者のスカリーゼという人が、グレゴリオ暦が採用された1582年に提唱した、「ユリウス日」というものを用いることがあります。 当時は旧約聖書の記述が本気で信じられていて、アダムとイブの生誕、つまり人類誕生の時期が紀元前4000年頃と考えられていたことと、計算の都合上から、ユリウス日では紀元前4713年1月1日を基点として0日とし、その日からの通算日数を計算します。 その際、紀元前4713年から1599年までの6312年間はユリウス暦を使ったとして、1年の日数を365.25日とし、1600年以後はグレゴリオ暦を使ったとして、1年の日数を365.2425日として計算します。

6312は4の倍数なので、紀元前4713年から1599年までの6312年間の日数は6312×365.25=2305458日ときっちりした日数となり、1599年12月31日のユリウス日は2305457日となります。 したがって1600年1月1日は2305458日となるはずですが、1582年にユリウス暦からグレゴリオ暦に改暦した時に、10月5日から14日の10日間をとばしていますので、1600年1月1日のユリウス日は2305448日となります。 さらに1600年は閏年ですから2月は29日まであり、この日のユリウス日は2305507日となります。

この数字に基づいて、1600年3月1日以後は次のような式でユリウス日を計算することができます。

ユリウス日=2305507+int[{146097×(c−16)}/4}+int{(1461×y)/4}+int{(153×M+2)/5}+d
c:西暦年数の上2桁
y:西暦年数の下2桁
M:西暦3月からの月数、すなわち月>2の時はM=月−3、月≦2の時はM=月+9としてyから1を減ずる
d:西暦日
int():切り捨てによる整数化関数

この式を用いて1997年10月23日のユリウス日を求めてみますと、2450745日となります。(←暇な方は検算してみてください。(^_-))

ユリウス日を用いますと、その日の曜日を簡単に求めることができます。 すなわち、ユリウス日を7で割った時の余りが次のような曜日に対応します。

0:月曜 1:火曜 2:水曜 3:木曜 4:金曜 5:土曜 6:日曜

例えば1997年10月23日については、2450745を7で割った時の余りは3ですから木曜となります。

コンピュータで日数計算をする時は、わざわざユリウス日を計算することはなく、前述の式の2305507を省略し、1600年3月1日を1日目とした通算日数を計算するか、次のような簡略化した式で通算日数Dを計算することが多いようです。

D=int{(146097×c)/4}+int{(1461×y)/4}+int{(153×M+2)/5}+d
c、y、M、d、int():前述のものと同じ

この式で計算した通算日数は、全てグレゴリオ暦を使ったと仮定した時の、仮想的な紀元前1年(計算上は紀元0年とする)3月1日を1日目としたものとなります。

この通算日数を利用して、僕が生まれてから今日(1997年10月23日)までの経過日数を計算しますと次のようになります。

本日:1997年10月23日…729626日
生誕日:1952年12月24日…713252日
経過日数=16374日

興味のある方は、この方法を利用して自分が生まれてから今日までの日数を計算してみてください。

またこの計算式を利用しますと、仮想的な紀元前1年3月1日を1日目とした通算日数Dから、西暦年月日を逆算することができます。

c=int{(4×D−1)/146097}
D=int[{(4×D−1) mod 146097}/4] と置き直して
y=int{(4×D+3)/1461}
D=int[{(4×D+3) mod 1461}/4]+1 と置き直して
M=int{(5×D−3)/153}
M<10の時はm=M+3、M≧10の時はm=M−9としてyに1を加える
d=int[{(5×D−3) mod 153}/5]+1
D:仮想的な紀元前1年3月1日を1日目とした通算日数
c:西暦年数の上2桁
y:西暦年数の下2桁
m:西暦月
d:西暦日
int():切り捨てによる整数化関数
Y mod X:YをXで割った余り

さらにこの式を応用すれば、ユリウス日を西暦年月日に変換することも簡単にできます。 これらの式を利用して、西暦年月日とユリウス日を相互変換する簡単なプログラムを組むことができます。 暇な方は、これらの式で西暦年月日と通算日数が相互変換できる原理を考えてみてください。 そしてもっと暇な方は、西暦年月日とユリウス日を相互変換するプログラムを考えてみてください。(^_-)

○太陽歴と閏年

通常、カレンダーの上での1年を「暦年」といい、太陽の動き、すなわち地球の公転周期に基づいた天文学的な1年を「太陽年」といいます。 現在の暦年は平年では365日、閏年では366日ですが、太陽年は観測と理論から平均365.2422日となります。 この太陽年に暦年を合わせるために、古代から色々な暦が工夫されてきました。

ヨーロッパにおける太陽暦の歴史は、古代エジプトで使われていた「エジプト暦」に始まると言われています。 エジプト暦では1年間に30日単位の月が12ヶ月あって、最後の5日間は1年に属さない日としてお祭りをしていました。 この暦ですと暦年は365日となり、4年でほぼ1日の割合で暦年の方が太陽年よりも早く進むことになります。

そこで西暦紀元前45年に、時のローマ共和国皇帝ユリウス・カエサル(ジュリアス・シーザー)が、アレキサンドリアの天文学者リシゲネスの進言を採用して、4年ごとに1回の閏年を入れる「ユリウス暦」を採用しました。 ユリウス暦では4年間を平均した時の1年の日数は、

平均1年日数=(365×3+366)/4=1461/4=365.25日

となり、太陽年との誤差は0.0078日(約11分)となります。

ちなみにユリウス暦を採用する時、従来のエジプト暦とのズレを解消するために、余分の2ヶ月(67日)を加え、さらに2月に23日を加えたため、BC45年は455日あったことになり、西暦上、一番長い1年となっています。 この歴改定で、ラテン語で8を意味するoctoに由来するOctoberが8月から10月に、novem(9)に由来するNovemberが9月から11月に、decem(10)に由来するDecemberが10月から12月になり、僕の学生時代の英語のテストの点を落とす結果となりました。(^^;)

ユリウス暦は長い間ヨーロッパで使われていましたが、16世紀になって太陽年とのズレが10日ほどになり、色々と不都合が生じてきました。 この頃には正確な太陽年が求められていましたので、1582年にローマ法王グレゴリオ13世が、より太陽年に近い「グレゴリオ暦」を定めました。 グレゴリオ暦は400年間に97回の閏年を入れるようにしており、そのために次のような規則で閏年を決めています。

  1. 西暦年数が4で割り切れる年は閏年とする。
  2. ただし年号が100でも割り切れる場合は閏年とはしない。
  3. ただし年号が400でも割り切れる場合は閏年とする。

以上まとめて「西暦年数が100で割れない年については4で割れる年を、100で割れる年については400でも割れる年を閏年とする」とも表現されます。 この方法ですと400年間を平均した時の1年の日数は、

平均1年日数=(365×400+97)/400=146097/400=365.2425日

となり、太陽年との誤差は0.0003日(約26秒)となります。 実は、128年間に31回の閏年を入れますと、

平均1年日数=(365×128+31)/128=46751/128=365.24219日

となり、400年間に97回の閏年を入れるよりも太陽年との誤差が少なくなります。 このことはグレゴリオ暦を作る時にもわかっていたのですが、128年間に31回の閏年を合理的に配置するのは難しいので、より使いやすい現行の方法が採用されたのです。 グレゴリオ暦は1万年間で3日ほど太陽年よりも遅れることになりますが、実用上はほとんど問題なく、現在も世界標準の太陽暦として利用されています。 ちなみにグレゴリオ暦を採用する時、従来のユリウス暦とのズレを解消するために、10月4日の翌日を10月15日としたため、1582年は西暦上一番短い1年となっています。

以上のようなヨーロッパの暦においては、1年の基点を定めるにあたって、エジプト暦の名残(年の最後の5日間の祭り)と、冬至と春分が重要なポイントとなりました。 古代からゲルマン民族は、冬至の日を中心として太陽の再生を祝う冬至祭を行っていましたが、この冬至祭とキリスト生誕を祝うクリスマスとが一緒になり、冬至の頃にクリスマスを祝っていましたので、12月25日を冬至付近に持ってくる必要がありました。

またキリスト教徒にとってクリスマスと並んで重要な日である復活祭は、春分の頃(春分後の最初の満月をすぎた日曜日)に祝っていましたので、3月21日を春分付近に持ってくる必要がありました。 そこで現行のグレゴリオ暦を採用する時、春分が3月21日付近となるように1年の基点が定められ、月と年との日数調整と閏年の日数調整は、2月にまとめて処理されることになりました。

日本の旧暦すなわち太陰太陽暦では、立春を1年の基点とし、これが正月元旦付近になるように暦を定めていましたので、明治時代に太陽暦を採用する時に暦が1ヶ月ほど早くなってしまい、古来の季節感と暦とが1ヶ月ほどずれてしまいました。 例えば旧暦では”新春”の元旦は立春前後であり(現在でも年賀状に「新春」とか「迎春」と書くのはその名残です)、3月3日の”桃の節句”の頃には桃の花が咲き、5月頃には”五月雨(梅雨)”が降りました。

お祭などの行事は七夕のように日付が重要なものは新暦でも同じ日に行いますが、季節感が重要なものは旧暦よりも約1ヶ月遅れの日に行うことが多いようです。 例えばお盆はもともと旧暦の7月15日の行事でしたが、新暦となって本来の季節とずれが生じたので、”月遅れ”の8月15日に行うようになりました。

太陰太陽暦であった旧暦からグレゴリオ暦に切り替わったのは1872年のことです。 この年は明治5年であり、この年の旧暦12月3日が新暦の明治6年1月1日となりました。 つまり、明治5年12月3日〜30日という日付は幻の日付となったわけです。 1ヶ月近い期間が消えてしまったわけですから、当時の人々は「時間を1ヶ月損した!」とか「寿命が1ヶ月縮まった!」などと思い込み、「時間を返せ〜っ!」と明治政府に文句をつける人達もいたそうです。 また、当時、明治政府は財政が逼迫していて、官吏に支払う給料を1カ月ごまかすために新暦に切り替えたという説が、まことしやかにささやかれたということです。(^^;)