プログラミング 自由研究

暦の面倒臭さと和暦の元号カレンダーを作った話

投稿日:

前書き

japanese-era-calendarというのを作った。

これは和暦の元号カレンダーで、過去すべての元号と西暦の対応表として使える。連続した値としてUNIX timeや修正ユリウス日も表記しているので、プログラムからでも利用しやすい。
なぜこういう物が必要なのか、説明したい。

そもそも暦とは

この記事を書いている今日は西暦2024年6月22日で、和暦だと令和6年6月22日だ。
西暦と和暦は年の数え方が違うだけ、少なくとも今はそうだ。
しかしこれは過去の日本で暦を国際化したからで、それまでは違う暦が使われていた。

そもそも暦というのは時代によって変化するものだ。現代日本でも”旧暦”という形で話に上がることあがる。
まず西洋にも旧暦が存在する。現行の国際的な暦はグレゴリオ暦といい、その前に西洋ではユリウス暦が使われていた。今の暦との違いは閏年(うるうどし)の数え方だ。
また日本における旧暦というのは、太陰暦つまり月の満ち欠けに合わせた暦だ。新月が1日で、満月が15日。「三日月」や「十五夜」という言葉にこの名残がある。この数え方だと12ヶ月では足らなくなってしまうので、ひと月余計に増やす閏月(うるうづき)というものがある。

このように、暦というのは世界の地域において様々な数え方で運用されており、昔は「ある地域の1月1日は他の地域でも1月1日」というわけではなかった。

暦をどう捉えるのか

1000年前の今日はいつ?

たとえば今から1000年前の今日を考える。1000年前の今日、とはいつだろう。

西暦でいえば1014年6月22日のこと、ととらえるのが自然だろうか。
しかし待ってほしい。西暦にも旧暦であるユリウス暦があった。1014年当時使われていた暦はユリウス暦だ。
そして「グレゴリオ暦で換算した1014年6月22日」と「ユリウス暦1014年6月22日」は別なのだ。

和暦でいえばどうなるだろう。西暦1014年は和暦だと長和3年に相当する。
では長和3年6月22日のことだろうか。
旧暦は日付がずれているので、ユリウス暦1014年6月22日に相当するのは長和3年5月22日だという考え方もある。

また、暦がどうとか言うのではなく、この際うるう年も無視して(1000 × 365)日前のことだ、としてもいい。
その場合該当するのはユリウス暦1025年2月14日、和暦だと万寿2年1月14日だ。

さて、「2024年6月22日の1000年前」にいくつか候補が出てきた。
「グレゴリオ暦で換算した1014年6月22日」、「ユリウス暦1014年6月22日 = 長和3年5月22日」、「長和3年6月22日」、「ユリウス暦1025年2月14日 = 万寿2年1月14日」。
これらのどれが正しいとかの話ではない。どれを採用してもいいだろう。

とにかく、暦とは複雑なものなのだ。

対応カレンダーの必要性

聖徳太子が生まれたのは何日前?

聖徳太子の誕生日は和暦でいうと敏達天皇3年1月1日、西暦だとユリウス暦574年2月7日である。
これは今日から何日前だろうか。答えは529,735日前だ。
この日数を何らかの計算式で弾き出せるだろうか。
西暦で換算しようにも、この間に何日のうるう年が挟まったのかをグレゴリオ暦とユリウス暦で分けて計算する必要があるというだけで吐き気がする。

こういった複雑さから、過去の日付を正しく得るには、何らかの計算式でパッと表せるわけではなく、カレンダーを知っておく必要がある。
計算すれば年月日を求められるのはグレゴリオ暦が通用する1582年10月15日以降に限られるのだ。

対応カレンダーの作り方

では対応カレンダーはどう作れば良いのか。

簡単だ、専門機関を信じるのだ。
古来より日本では暦は天文学の管轄だった。現代でも春分の日と秋分の日の2つの祝日は国立天文台が発表しているのだ。
というわけで国立天文台が暦計算室というWebサイトを公開していて、過去のすべての年号のカレンダーを取得できるようになっている。
国立天文台がどのように暦を管理しているか、というと、それはもう歴史の積み重ねだろう。ありがたく利用させていただこう。

この国立天文台のデータを整形し、プログラムから使いやすくしたのが冒頭のjapanese-era-calendarである。
国立天文台のデータには既に修正ユリウス日や皇紀は付与されていたが、一般的なプログラマーにはUNIX timeの方が馴染みがあるだろうと自前でUNIX timeも付与した。
1日毎のデータだと行が溢れかえってしまうので、要点だけを絞った簡略版も提供しているので、プログラミング能力に応じて使い分けてほしい。

おわりに

というわけで、暦の複雑さは理解頂けたと思う。
なるべく暦とかかわらない人生を送って頂けると幸いである。

-プログラミング, 自由研究

執筆者:

関連記事

no image

[python]Windows環境でsubprocessするときは文字コードに気をつけて

pythonは内部の文字コードと実行環境の文字コードが色々絡み合っていて、いろんなところで悪さをする。 特にWindows環境だと、内部はUTF-8で動いているのに実行環境はShift-JIS(正確に …

no image

MagicaVoxelでUnity用の人間モデルを作ろう(東北ずん子配布もあるよ)

もくじ1 概要1.1 目標1.2 手順1.3 作成モデル2 MagicaVoxel2.1 パーツ分割2.2 出力3 Blender3.1 インポート3.2 モデルの初期調整3.2.1 重複する頂点の削 …

no image

M5StickC Plusの明るさ(M5.Axp.ScreenBreath)、0~100かもしれない

M5StickC Plusで画面の明るさを調整するM5.Axp.ScreenBreath()という関数があります。 日本語リファレンスでは指定値7~12ということになっています。 また、公式ドキュメン …

no image

C言語のポインタに関する補足説明

前回、C言語のポインタに関する解説記事を書きまして、そこそこの反響を貰うとともにいくつかの指摘を受けました。 前回の記事では幾つか「ウソではないけど真実と違う」記述がありまして、その点を補足としていく …

no image

マイナンバーカードは偽造できるのか

もくじ1 まえがき2 見た目はともかくICチップの偽造は難しい3 ICチップは何をしているの?4 どんな抜け道があるの?5 おわりに まえがき マイナンバーカード、発行してますか?私は持ってます。 さ …