Emacsと暦


# はじめに

本記事は、Emacs のカレンダー機能・天文計算ツールの簡単な紹介、Emacsでサポートされている世界の暦、また本フレームワークを使った、和暦の実装を試みと、その際に気づいた注意点を紹介します。また「またアジア各国の旧暦に関する雑学」についても触れています。


# 世界の暦

世界には様々な暦が存在します。

人類が月の満ち欠けを意識し、農耕・牧畜、そして宗教祭礼を始めた頃から、一年のうち、どの時期に何をするかを記録することは、社会生活を営む上で重要となり、そこから暦の概念は始まったと考えられます。

その中でもグレゴリオ暦は、世界的に共通の暦として使われ、日本でも多くの年中行事の基準となっています。

しかし、欧米を除いて単一の暦を使っている国はあまり多くはなく、ほとんどの国が、ローカルな暦とグレゴリオ暦を併用しています。グレゴリオ暦のみを使っている日本は、欧米以外では数少ない例外です。

たとえばイランのカレンダーでは「[ヒジュラ暦](http://ja.wikipedia.org/wiki/ヒジュラ暦)・[ヘブライ暦](http://ja.wikipedia.org/wiki/ヘブライ暦)・[イラン暦](http://ja.wikipedia.org/wiki/イラン暦)・[グレゴリオ暦](http://ja.wikipedia.org/wiki/グレゴリオ暦)」が並記されていたり、インドネシア・バリ島の「2種類の[バリ暦](http://ja.wikipedia.org/wiki/バリ暦)・グレゴリオ暦・[ヒンドゥー暦](http://ja.wikipedia.org/wiki/ヒンドゥー暦)・イスラム暦」が並記されたカレンダー・トルランシ、4つやそれ以上の暦を併用している国・地域もあります。

沖縄県では現在でも一部地域で旧暦の旧正月などを祝うため、「[沖縄琉球暦](https://honto.jp/netstore/pd-book_30577071.html)」が出版されています。

このように、計算機でも複数の暦を並行して扱うニーズは以前からありました。


# Emacs の暦 (calendar)

Emacsには[カレンダー機能](https://ayatakesi.github.io/emacs/27.1/html/Calendar_002fDiary.html)があります。Emacs Calendar は、中国農暦やイスラム暦から、フランス革命暦やマヤ暦のような歴史上の暦まで、多くの暦をサポートしています。

1980年代～1990年代にかけて、イリノイ工科大学のコンピュータ科学者 [Edward M. Reingold](https://en.wikipedia.org/wiki/Edward_Reingold) 博士は、世界中で使われている様々な暦を調査し、それらを天文計算から生成したり、互いに換算する計算機アーキテクチャの実現を志しました。これらは当初、 Emacs Lisp で実装され、後にCommon Lispへ移行しました。

その成果は、後に Emacs にContribute されました。これが、現在のEmacsに付属しているカレンダー機能と天文計算ツール群です。


# Emacs が対応する暦

Emacs カレンダーがサポートしている暦を以下に紹介します。まずEmacsカレンダーの標準は「先発グレゴリオ暦」です。

そこから、[Rata Die](https://en.wikipedia.org/wiki/Rata_Die) (R.D) と呼ばれる、「先発グレゴリオ暦元年1月1日からの経過日数」を経由して、以下に示す暦へ変換、または逆変換ができます。

Emacs Calendar API では、 `calendar-absolute-from-XXXX`, `calendar-XXXX-from-absolute` 関数を用います。

カレンダーアプリにおける各暦の表示は、 `M-x calendar-XXXX-print-date` で、暦の換算は、 `M-x calendar-XXXX-goto-date` で行い、それぞれ、"p"と"g"のprefixキーが割り当てられています。


## グレゴリオ暦・先発グレゴリオ暦 (略称 AD または CE)

Emacsで、 `M-x calendar` で表示されるデフォルトの暦です。日本や欧米で一般に使われてる太陽暦です。4年に一度、閏年を挿入しますが、400年に3度、閏年を除外します。Linuxのcalコマンドは、[1752年9月でユリウス暦からグレゴリオ暦に切り替わり](https://www.ipsj.or.jp/07editj/promenade/4701.pdf)ますが、これはイギリスとその植民地（オーストラリア・現在アメリカの一部など）での切替日に倣います。制定されたのは1582年ですが、それ以前に遡って過去に適用するのを先発 (proleptic) グレゴリオ暦と呼びます。

1752年以前、または1582年以前の日付処理に、ユリウス暦を使うか、先発グレゴリオ暦を使うかは、システムによって異なります。先発グレゴリオ暦を扱うシステムと、ユリウス暦を使うシステムの間で日付をやりとりするとき、1000年や1400年は閏年か否かが異なるので、エラーが出ることがあります。

Python, MySQL, Java (java.util.GregorianCalendar), Emacs Lisp 等は先発グレゴリオ暦を採用しています。また、日本のいくつかの記念日（建国記念日など）も、日本書紀に記載された旧暦を先発グレゴリオ暦に換算して定めています。

グレゴリオ暦は西暦とセットで扱われることが多いですが、必ずしも紀元が西暦とは限りません。日本では西暦・元号の両方でグレゴリオ暦を用いますが、他の国でも紀元が異なるだけで、日付はグレゴリオ暦と同じ暦を採用しています。（なお、偶然にも台湾の[中華民国暦](http://ja.wikipedia.org/wiki/中華民国暦)と北朝鮮の[主体暦](https://ja.wikipedia.org/wiki/主体暦)と日本の大正はすべて西暦1912年紀元です。）


## ユリウス暦・先発ユリウス暦 (calendar-julian-print-date)

ジュリアス・シーザーが、クレオパトラのエジプトの影響を受け、[古代エジプト暦](https://eco.mtk.nao.ac.jp/koyomi/wiki/B8C5C2E5A5A8A5B8A5D7A5C8CEF1.html)をローマに移植して、紀元前45年から実施した太陽暦です。4年に一度、閏年を入れます。

導入当時は年はローマの[2人の執政官で年を表記](https://ja.wikibooks.org/wiki/ガイウス・ユリウス・カエサルの著作/ラテン語の紀年法)していました。その後、[ローマ建国紀元](https://ja.wikipedia.org/wiki/ローマ建国紀元)や[ディオクレティアヌス紀元](https://ja.wikipedia.org/wiki/ディオクレティアヌス紀元)が使われ、現在の西暦が[考案](https://ja.wikipedia.org/wiki/ディオニュシウス・エクシグウス)、使われ始めたのは525年からです。

紀元前45年から8年くらいにかけて、誤って閏年を3年に1回入れたため、3日ほど誤差が蓄積し、修正のためにしばらく閏年を入れない時期がありました。いつ閏年を入れて、いつ抜いたのかは諸説ありますが、少なくとも西暦8年には現在の形に落ち着いたようです。

西暦8年以前において、上記の事情を考慮せずに遡って4年に一度の閏年を適用するのを、「先発ユリウス暦 ([Proleptic Julian Calendar](https://en.wikipedia.org/wiki/Proleptic_Julian_calendar)）」といいます。Emacsのユリウス暦は、西暦1年1月3日から西暦8年までは「先発ユリウス暦」を採用しています。

ユリウス暦は長らくヨーロッパで使われ、16世紀から徐々にグレゴリオ暦に移行しましたが、移行日は国・地域によってばらばらです。

旧ソ連諸国などでのロシア正教は今でもグレゴリオ暦を採用しておらず、儀礼にはユリウス暦を用いています。グレゴリオ暦と13日ほどずれるので、ロシア正教ではクリスマスが1月にあったり、1月13日に、1月1日とは別に旧正月を祝ったりします。

グレゴリオ暦2020年12月25日は、ユリウス暦で2020年12月12日です。


## ISO 8601暦 (calendar-iso-print-date)

１年を四半期と週番号で表現します。欧米の一部の企業（主に小売業）で会計年度に使われます。たとえばアップルの会計年度はISO暦ですが、アマゾンの会計年度はグレゴリオ暦です。2020年12月25日は、ISO暦で2020年52週5日です。第一週は1月1日に最も近い最初の月曜日から始まります。


## ヘブライ暦 (calendar-hebrew-print-date)

[ユダヤ暦](http://eco.mtk.nao.ac.jp/koyomi/wiki/A5E6A5C0A5E4CEF1.html)ともいい、旧約聖書の天地創造の日（紀元前3761年10月7日）を起源とする暦で、イスラエルで使われています。[19年に7閏月を挿入](https://eco.mtk.nao.ac.jp/koyomi/wiki/C2C0B1A2C2C0CDDBCEF1.html#n6ad3ed8)します（メトン周期・章法）。


## イスラム暦（ヒジュラ暦） (calendar-islam-print-date) (略称A.M.)

[西暦622年](https://ja.wikipedia.org/wiki/ヒジュラ)を紀元とし、[月の満ち欠け](https://eco.mtk.nao.ac.jp/koyomi/wiki/B7EEA4CECBFEA4C1B7E7A4B1.html)のみを考慮した太陰暦で、太陽暦とは毎年およそ[11日](https://eco.mtk.nao.ac.jp/koyomi/wiki/A5A4A5B9A5E9A5E0CEF1.html)ずれます。偶数月は29日、奇数月は30日で、30年に11閏日を挿入して実際の月の周期と合わせます。1日は新月ではなく、三日月です。2020年12月25日は、イスラム暦の1442年5月10日です。


## イラン暦（ペルシア暦） (calendar-persian-print-date) (略称A.P.)

農業などに向けて、紀元をイスラム暦に合わせ、春分（に最も近い午前0時）を1月1日とする太陽暦です。[イラン](http://en.iran.ir/about/iranian-calendar)で使われています。2020年12月25日は、イラン暦で1399年10月5日です。


## エチオピア暦 (calendar-ethiopic-print-date) (略称E.E.)

エチオピアで使われている暦です。キリストの生年を西暦7年と定め、それを紀元としており、西暦とおよそ７年ずれます。グレゴリオ暦の9月中旬頃に新年が始まり、毎月30日の12ヶ月の後に、5～6日の第13月がきます。2020年12月25日は、エチオピア暦の2013年4月26日です。


## コプト暦 (calendar-coptic-print-date)

コプト暦は、エジプトの農家やコプト正教会で使われる暦です。現存最古の太陽暦で、ユリウス暦の元にもなりました。月日はエチオピア暦と同じです。現在のコプト暦は[ディオクレティアヌス紀元](http://ja.wikipedia.org/wiki/ディオクレティアヌス紀元)を用いているため、西暦とおよそ284年ずれます。2020年12月25日は、コプト暦の1737年4月16日です。


## バハーイー暦 (calendar-bahai-print-date) (略称B.E.)

19世紀にイランで創始され、イスラエルの[カルメル山](http://ja.wikipedia.org/wiki/カルメル山)に総本山がある、[バハーイー教](http://ja.wikipedia.org/wiki/バハーイー教)の儀礼に使われる暦です。春分で1月1日が始まり、1ヶ月19日が19ヶ月 (361日) であり、18月と19月の間に閏日が5～6日挿入されます。


## 農暦 (calendar-chinese-print-date)

中国の太陽太陰暦です。現在では、東経120度を基準子午線とした暦で、中国政府が管理します。いわゆる "Chinese New Year" で、世界中の華僑がお祝いします。

たとえばタイでは、グレゴリオ暦の正月、華僑の旧正月、[ソンクラーン](http://ja.wikipedia.org/wiki/ソンクラーン)で3つのお正月を祝うと言われています。

置閏は[時憲暦](http://ja.wikipedia.org/wiki/時憲暦)に従い、現在では天文計算で正確に求めることができます。Emacs Calendar にて算出される旧正月と、実際の旧正月は少なくとも[2021年(2月12日)～2030年](https://ja.wikipedia.org/wiki/旧正月#旧正月の日付)では一致します。

M-x calendar-chinese-goto-date では、干支は甲子を1，癸亥を60とする番号で指定します。

また、黄帝紀年（紀元前2697年の甲子の年）からの干支の巡回数を最初に指定します。1984年～2043年は第78巡です。


## マヤ暦 (calendar-mayan-print-date)

長期暦・ツォルキン暦 (265日周期) ・ハアブ暦(365日周期)の[3種類](https://eco.mtk.nao.ac.jp/koyomi/wiki/A5DEA5E4CEF1.html)があります。

### [長期暦](https://ja.wikipedia.org/wiki/長期暦)
先発グレゴリオ暦の紀元前3114年8月11日を起点とする、20x18x20x20=144000日≒およそ394年で１バクトゥンと数える暦です。原則として20進法で各桁がカウントされますが、２桁目だけ、１年と近似するために18サイクル（18x20=360日サイクル）となっています。
2012年12月21日は、第13バクトゥンの開始 (13.0.0.0.0) となるため、話題になりました。
現在では一般には使われていません。2020年12月25日は 13.0.8.2.6 となります。

### [ツォルキン暦](https://ja.wikipedia.org/wiki/ツォルキン) 
13日周期と、20日周期の組み合わせで表記され、最小公倍数の260日で１週する暦です。
グアテマラ高原の多くの集落などで、現代でも使用されています。
Emacsでは、一般的なユカテコ語表記が採用されていますが、1990年に設立された [グアテマラ・マヤ語族アカデミー](https://en.wikipedia.org/wiki/Academia_de_Lenguas_Mayas_de_Guatemala) によって別の正書法が定められています。
2020年12月24日は、"4 Chicchan" であり、12月25日は、"5 Cimi" となります。

### [ハアブ暦](https://ja.wikipedia.org/wiki/ハアブ) 
1ヶ月が20日の18の月と、年末に付け足される5日間で合わせて365日を周期とする暦です。
2020年12月25日は、 "9 Kankin" となります。
現在は西暦と融合してしまい、ほとんど使われていません。

しかし、260日と365日の最小公倍数である18,980日 （tzolkin暦の73年・Haab暦の52年）を[一周](https://ja.wikipedia.org/wiki/カレンダー・ラウンド) とする考え方は現在でも生きており、52歳の誕生日は特別に祝うなどの慣習が一部に残っています。

## フランス革命暦 (calendar-french-print-date)

フランス革命時のグレゴリオ暦1792年9月22日から使われた暦です。1806年に、ナポレオンにより廃止（帝制暦＝グレゴリオ暦へ移行）されました。


## ユリウス日 (calendar-astro-print-day-number) (JD)

紀元前4713年1月1日（先発ユリウス暦）正午（UTC+0）から現在までの経過日数を記します。ユリウスという名前ではありますが、ユリウス暦とは無関係です。

上述の暦の日とは違い、時差はなく、絶対時間を表現します。時間は小数で表します。UTCにおける深夜0時では 小数部が ".5" となります。1日は86400秒のため、秒の表現には小数5桁が必要です。

日本はUTCより9時間早いため、日本時間の表現にはUTC時間から 9÷24=0.375を減らします。

Emacsで天文計算を行う場合は、時差・夏時間などをグローバル変数で設定すると、各関数がユリウス日からの調整を自動的に行います。日本の場合は、 `calendar-time-zone` 変数を、UTCからの時差である540分に設定します。2020年12月25日の日本時間の夜12:00は、第2459209.125 [ユリウス日](https://ja.wikipedia.org/wiki/ユリウス通日)です。

# diary による暦の表示

[Emacs Diary](http://www.gnu.org/s/emacs/manual/html_node/emacs/Diary.html)  は、　プレーンテキストに書いた日記・予定を解釈し、カレンダー表示の際に別のバッファに当日の記録や予定を表示する機能です。 

diary には、指定された日時において、Emacs Lisp 関数を呼び出し表示する機能があります。これを使うことで、カレンダーを表示する際に、別のバッファで各種の暦の日付を表示できます。

以下は　Emacs でサポートしている各暦の日付を表示する、diary の記述例です。

```
&%%(diary-sunrise-sunset)
&%%(diary-lunar-phases)
&%%(diary-moonrise-moonset)
&%%(diary-chinese-date)

&%%(diary-day-of-year)
&%%(diary-iso-date)
&%%(diary-julian-date)
&%%(diary-astro-day-number)
&%%(diary-bahai-date)
&%%(diary-coptic-date)
&%%(diary-ethiopic-date)

&%%(diary-hebrew-date)
&%%(diary-hebrew-rosh-hodesh)
&%%(diary-hebrew-parasha)
&%%(diary-hebrew-sabbath-candles)
&%%(diary-hebrew-omer)

&%%(diary-islamic-date)
&%%(diary-mayan-date)
&%%(diary-persian-date)
```



# Emacs の太陽・月の天文計算

Emacs には、暦を求めるのに有用な天文計算を行うツールがあります。
計算アルゴリズムには　[ジャン・メーウス](https://ja.wikipedia.org/wiki/ジャン・メーウス)が開発した “Astronomical Algorithms” および Pierre Bretagnon と Jean-Louis Simon　の “Planetary Programs and Tables from -4000 to +2800” を利用しています。これらのアルゴリズムは、 [Python](https://github.com/architest/pymeeus)  や [C++](http://www.naughter.com/aa.html) のライブラリでも提供され、幅広く使われています。

このアルゴリズムを使うことで、1951年から2050年の間は、日の出・日の入りの時間は２分以下の誤差、二至二分の計算は１分以下の誤差となります。

## solar.el

`solar.el` は、[日の出入](http://eco.mtk.nao.ac.jp/koyomi/wiki/C6FCA4CEBDD0C6FEA4EAA4C8C6EEC3E62FC6FCA4CEBDD0C6FEA4EAA4CEC4EAB5C1.html) `solar-sunrise-sunset` ・[恒星時](https://eco.mtk.nao.ac.jp/koyomi/wiki/B9B1C0B1BBFE.html) `solar-sidereal-time` ・[暦表時](https://eco.mtk.nao.ac.jp/koyomi/wiki/CEF1C9BDBBFE.html) `solar-ephemeris-time`、 [ΔＴ](https://eco.mtk.nao.ac.jp/koyomi/wiki/A6A4A3D4.html) `solar-ephemeris-correction`、[黄道座標](https://eco.mtk.nao.ac.jp/koyomi/wiki/B2ABC6BBBAC2C9B8B7CF.html) `solar-ecliptic-coordinate`、[赤道座標](https://eco.mtk.nao.ac.jp/koyomi/wiki/C0D6C6BBBAC2C9B8B7CF.html) `solar-equatorial-coordinate`, [地平座標](https://www.astroarts.co.jp/alacarte/kiso/kiso02-j.shtml) `solar-horizontal-coordinate` 、[二至二分](https://eco.mtk.nao.ac.jp/koyomi/wiki/B5A8C0E12FC6F3BDBDBBCDC0E1B5A4A4C8A4CFA1A9.html) `solar-equinoxes/solstices`、[正午](https://eco.mtk.nao.ac.jp/koyomi/wiki/CDD7C1C72F1C6FCA4C8A4CFA1A92FB8E1C1B0A4C8B8E1B8E5.html) `solar-exact-local-noon` などを計算する関数を提供します。

また、　`solar-date-next-longitude` を使うと、黄道での[二十四節気](https://eco.mtk.nao.ac.jp/koyomi/wiki/B5A8C0E12FC6F3BDBDBBCDC0E1B5A4A4C8A4CFA1A9.html)の通過時刻を求められます。

例として、2021年の節分が （124年ぶりに） 2月2日になるのを計算で確かめる例を示します。

節分の定義は黄経315度通過日（立春）の前日です。そのため、以下のように315度通過前が確実なグレゴリオ暦日（2月1日）からの、45度の倍数角の通過日時として計算できます。

```el
(setq calendar-daylight-savings-starts nil
      calendar-daylight-savings-starts-time nil
      calendar-daylight-savings-ends nil
      calendar-daylight-savings-ends-time nil
      calendar-daylight-time-offset nil
      calendar-time-zone 540) ;; 日本はUTCから540分の時差。
(let* ((abs (calendar-astro-to-absolute
             (solar-date-next-longitude
              (calendar-astro-from-absolute
               (calendar-absolute-from-gregorian '(2 1 2020))) 45)))
      (time (- abs (floor abs))))
  (concat
   (calendar-date-string (calendar-gregorian-from-absolute (floor abs)) t)
   " " (solar-time-string (* time 24) nil)))
"2020-02-04 6:02pm" ; 2020年の立春は2月4日
(let* ((abs (calendar-astro-to-absolute
             (solar-date-next-longitude
              (calendar-astro-from-absolute
               (calendar-absolute-from-gregorian '(2 1 2021))) 45)))
      (time (- abs (floor abs))))
  (concat
   (calendar-date-string (calendar-gregorian-from-absolute (floor abs)) t)
   " " (solar-time-string (* time 24) nil)))
"2021-02-03 11:58pm" ; 2021年の立春は2月3日
```

これらを、[暦要項](https://eco.mtk.nao.ac.jp/koyomi/yoko/2021/rekiyou212.html)と比較すると、1分の誤差があります。

本関数の利用例については、本節末尾の「【参考】旧暦2033年問題」を参照してください。


## lunar.el

[朔](https://eco.mtk.nao.ac.jp/koyomi/wiki/B7EEA4CECBFEA4C1B7E7A4B1.html) (lunar-new-moon-time), [月齢](https://eco.mtk.nao.ac.jp/koyomi/wiki/B7EEA4CECBFEA4C1B7E7A4B12FB7EECEF0.html) (lunar-phase) などを求めることができます。

たとえば、 `lunar-new-moon-or-after` 関数を使って2021年1月の新月を求めてみます。

```el
(let* ((abs (calendar-astro-to-absolute
             (lunar-new-moon-on-or-after
              (calendar-astro-from-absolute
               (calendar-absolute-from-gregorian '(1 1 2021))))))
       (time (- abs (floor abs))))
  (concat
   (calendar-date-string (calendar-gregorian-from-absolute (floor abs)) t)
   " " (solar-time-string (* time 24) nil)))
"2021-01-13 1:59pm"
```

これを[暦要項](https://eco.mtk.nao.ac.jp/koyomi/yoko/2021/rekiyou213.html)と比較すると、1分ずれています。

2033年12月の朔を求めてみると、以下のように冬至の5時間後となることが分かります。

```el
(let* ((abs (calendar-astro-to-absolute
             (lunar-new-moon-on-or-after
              (calendar-astro-from-absolute
               (calendar-absolute-from-gregorian '(12 1 2033))))))
       (time (- abs (floor abs))))
  (concat
   (calendar-date-string (calendar-gregorian-from-absolute (floor abs)) t)
   " " (solar-time-string (* time 24) nil)))
"2033-12-22 3:45am" ; 2033年12月の朔は12月22日。
```


## <https://github.com/misohena/moonrise-el>

misohena さんが[作成したツール](http://misohena.jp/blog/2020/06)で、月の出入を計算できます。

なお、月の出入の計算は極めて困難で、天文計算ライブラリはほとんど利用不可能です。


# 和暦の実装について

2019年5月、[令和](http://ja.wikipedia.org/wiki/令和)への[改元](http://ja.wikipedia.org/wiki/改元)に伴い、iOSのカレンダーに、7世紀以降の「和暦」がサポートされ、[話題](https://news.mynavi.jp/article/20190120-iphone_why/)になりました。iOSの「一般設定」の「地域と言語」では、カレンダーとして「和暦」が選択でき、設定すると西暦の代わりに元号が表示され、[大化](http://ja.wikipedia.org/wiki/大化)から設定できます。

しかし、この機能には[批判](https://kakuyomu.jp/works/1177354054886223897/episodes/1177354054888260263)がありました。iOSの「和暦」は、西暦年を対応する元号年に置き換えただけだからです。たとえば「元禄15年」は、8月の次に「閏8月」があるので13ヶ月になります。一方、iOS カレンダーの「元禄15年」は12ヶ月のみで、1702年のグレゴリオ暦がそのまま表示されます。

よく言われる[元禄赤穂事件](https://ja.wikipedia.org/wiki/赤穂事件)が起きた「元禄15年12月14日」はグレゴリオ暦では「1703年1月30日」に対応しますが、iOSカレンダーで和暦のこの日にイベントを入れて、西暦で表示しても、グレゴリオ暦には変換されません。

ここでは「和暦」を実装するにあたり、参照すべき資料と注意点いついて紹介します。


# 和暦の計算

[和暦](https://eco.mtk.nao.ac.jp/koyomi/wiki/CEF2BBCB2FC6FCCBDCA4CECEF1.html)の計算方法は、6世紀頃に中国から日本に伝わった[元嘉暦](https://eco.mtk.nao.ac.jp/koyomi/wiki/B8B5B2C5CEF1.html)から、明治に廃止された[天保暦](http://eco.mtk.nao.ac.jp/koyomi/wiki/CEF2BBCB2FC6FCCBDCA4CECEF12F5.BDC2C0EEB7CACDA4A4C8C5B7CADDCEF1.html)まで、何度か変更されました。しかし、基本としては中国・東アジアと共通で以下の通りとなります。

-   1年を冬至を起点に24分割し、その奇数番目を中気とする　（時間で分割するのを[平気](https://eco.mtk.nao.ac.jp/koyomi/wiki/B5A8C0E12FC6F3BDBDBBCDC0E1B5A4A4CEC4EAA4E1CAFD.html#w1c5cccb)、軌道で分割するのを[定気](https://eco.mtk.nao.ac.jp/koyomi/wiki/B5A8C0E12FC6F3BDBDBBCDC0E1B5A4A4CEC4EAA4E1CAFD.html#b53dad44)と呼ぶ）。
-   新月の日（朔）を、毎月の1日とする。
-   冬至を含む月は11月とする（冬至の次の次の新月を新年とする）。
-   1年≒365.2422日で、中気の間は平均で30.44日、一方 [1月≒29.53日](https://eco.mtk.nao.ac.jp/koyomi/wiki/B7EEA4CECBFEA4C1B7E7A4B1.html)と、12ヶ月は1年よりやや短いため、だいたい3年に1ヶ月、どの中気も割り当てられない月が出てくる。[これを「閏月」とする](https://eco.mtk.nao.ac.jp/koyomi/wiki/C2C0B1A2C2C0CDDBCEF12FC3D6B1BCCBA1.html#c206a483)ことで、太陽暦と太陰暦のずれを調整する。

上記を原則として、いくつかの細かいルールや定数を定め、周期性を仮定して計算していました。ただし、どれほど定数の精度をあげても、歳差運動・他の惑星などによる摂動などで、天体の周期性は変動します。ある程度の時間が経過すると誤差が蓄積するため改暦は必然でした。

ただ日本にとって幸運なことに、ちょうど13世紀頃、冬至と近日点がほぼ重なっていたため、その前後でおよそ800年にわたり使われていた[宣明暦](https://eco.mtk.nao.ac.jp/koyomi/wiki/C0EBCCC0CEF1.html)は諸定数が安定して正確に運用できました。

和暦の一ヶ月は29日（小の月）か30日（大の月）になります。ただし、閏月や[月の大小](https://eco.mtk.nao.ac.jp/koyomi/wiki/B7EEA4CECBFEA4C1B7E7A4B12FB7EEA4CECEF1A4CEC2E7A4C8BEAE.html)は交互に来るとは限らないし、さらに、計算だけで決まるわけではありません。時の政府が、様々な事情で計算結果に対して[人為的に補正](https://eco.mtk.nao.ac.jp/koyomi/wiki/C2C0B1A2C2C0CDDBCEF12FC6FCCBDCA4CECEF1C6FCA5C7A1BCA5BFA5D9A1BCA5B9.html)することがあったからです。そのため、和暦の実装にあたっては、月の大小データを別途、データベースとして持つ必要があります。

長期にわたる和暦データ（長暦）の基礎文献は、[内田正男『日本暦日原典』雄山閣 (1975)](https://ja.wikipedia.org/wiki/日本暦日原典) です。本書は、実際の天文の計算結果と、各時代の暦・文献に基づいて、445年からの和暦の詳細情報を提供しています。

『日本暦日原典』の大部分は、1970年代のプリンタの出力をそのまま印刷したものです。コンピュータによる計算結果を組版せずに読者に産地直送することで、誤植の危険性を排するのが目的です。過去には暦の計算において、多くの計算・転記ミスがあったため、この方式は関係者に高い信頼を得ました。本書は何度か校訂されており、最新のデータを確認するには、国立天文台の[暦Wiki](https://eco.mtk.nao.ac.jp/koyomi/wiki/C2C0B1A2C2C0CDDBCEF12FC6FCCBDCA4CECEF1C6FCA5C7A1BCA5BFA5D9A1BCA5B9.html)にある訂正表を用います。

閏月は約3年に1回、現れるため、和暦プログラムでは通常、内部で月インデックスと月を分離して扱います。

日本は1872年12月2日の翌日から[グレゴリオ暦に改め](https://ja.wikipedia.org/wiki/グレゴリオ暦#改暦の公布)、1873年1月1日になりました。そのため、和暦プログラムでのこの境界を扱う必要があります。


# 和暦の元号

iOSの「和暦」カレンダーは、どんな年でも和暦の元号を1種類しか表示しません。

しかし原則として、暦は、たとえ元号が翌年変わることが事前に分かっていても、必ず前年の元号で発行されます。「○○元年」という暦は存在せず、新元号の暦は必ず「2年」以降で始まります。

そのためソフトウェアで元号を表示するならば、「平成31年・令和元年」や、「貞享5年・元禄元年」のように新旧両方の元号を並記した方が良いでしょう。749年は、1年で2回改元したため、「天平21年」・「天平感宝元年」・「天平勝宝元年」の3つの元号が対応します。

各元号の1年を「元年」とする慣習は現在でも残っていますが、暦にて1月を[「正月」と表記する](https://dl.ndl.go.jp/info:ndljp/pid/2535071/2)慣習は明治以降は[廃れた](https://dl.ndl.go.jp/info:ndljp/pid/2555225/3)ようです。和暦にて、明治以前の1月を正月と表示するかは実装次第でしょう。

[私年号](http://ja.wikipedia.org/wiki/私年号)をのぞき、日本では複数の元号が並立した時期が3回あります。

-   1181年から1185年にかけての、源氏と平家がそれぞれの天皇を擁立して対立していた時期。
-   1331年から1333年の建武の新政の前、および1336年から1392年に至る、皇室が大覚寺統と持明院統で対立していた時期。

たとえば1181年は、[治承・寿永の乱](http://ja.wikipedia.org/wiki/治承・寿永の乱)の時期で、源氏方は治承を使い続けたため、「寿永元年・養和2年・治承6年」の3つの元号が対応します。1332年は、皇室が大覚寺統と持明院統に分離していたときに持明院統が改元したため、「正慶元年・元弘2年・元徳4年」の3つの元号が対応します。

また南北朝時代において、1381年は辛酉革命・1384年は甲子革令の年（後述）だったため、4つの元号が対応します。

-   1381年は「天授4年・弘和元年・康暦4年・永徳元年」。
-   1384年は「弘和4年・元中元年・永徳4年・至徳元年」。


# 和暦の干支

十干は「甲」から「癸」までの10周期、十二支は「子」から「亥」までの12周期のカウンタです。両者を合わせた[干支](https://ja.wikipedia.org/wiki/干支)は「甲子」から「癸亥」までの60周期のカウンタで、年・月・日の単位で巡回します（年干支・月干支・日干支）。

年干支は、（西暦年ー4） mod 60 ＝0 を甲子として循環します。

月干支は、（西暦年×12＋月＋13） mod 60 ＝0 を甲子として循環します。月干支では、閏月は前月の干支を踏襲します。そのため、「冬至」を含む開始月となる11月は「子」で固定されます。

日干支は、（先発グレゴリオ暦の西暦1年1月1日からの経過日数＋13） mod 60 = 0 を甲子として循環します。

古記録では、しばしば、年月日は数字ではなく干支で書かれます。そのため和暦の指定にあたっては、ユーザインタフェースでの入力値として **数値に並んで干支も用意する** のが望ましいです。


## 干支の訓読み

干支の訓読みにはバリエーションがあり、十干が五行の「弟」の場合は、十二支の前に「の」を付ける場合があります。たとえば、「辛亥」は「かのとい」と「かのとのい」の2通りの読み方がありますが、ATOKのように一部のIMEは、前者のみ変換できます。

cal-japan.el では、現状では `calendar-japanese-sexagenary-form` で「の」を付けるか指定できます。


## 干支の音読み

干支のうち、「甲子」は「コウシ」だけではなく「カッシ」とも読みます。

十干のうち、甲・庚は両方とも「コウ」、己・癸は両方とも「キ」と読みます。また、十二支のうち、辰・申は両方とも「シン」と読みます。

そのため、以下の干支は現代仮名遣いでは同じ音読みとなります。「コウシン塚」は「庚申塚」であり、甲辰や庚辰ではないことに注意します。

| 音読み   | 干支   |          |          |          |
|:---------|:-------|:---------|:---------|:---------|
| コウシ   | 甲子(00)| 庚子(36) |          |          |
| ボシン   | 戊辰(04)| 戊申(44) |          |          |
| キシ     | 己巳(05)| 癸巳(29) |          |          |
| コウゴ   | 庚午(06)| 甲午(30) |          |          |
| ジンシン | 壬申(08)| 壬辰(28) |          |          |
| キユウ   | 癸酉(09)| 己酉(45) |          |          |
| コウジュツ| 甲戌(10)| 庚戌(46) |          |          |
| キボウ   | 己卯(15)| 癸卯(39) |          |          |
| コウシン | 庚辰(16)| 甲申(20) | 甲辰(40) | 庚申(56) |
| キビ     | 癸未(19)| 己未(55) |          |          |
| キチュウ | 己丑(25)| 癸丑(49) |          |          |
| コウイン | 庚寅(26)| 甲寅(50) |          |          |
| ヘイシン | 丙申(32)| 丙辰(52) |          |          |
| キガイ   | 己亥(35)| 癸亥(59) |          |          |

また、特殊な読み方として、五行と組み合わせて読む場合があります。例えば、「甲」は五行が「木」のため、「甲＋木」で「コウボク」と読み、「甲子」で「コウボクのね」等と読みます。


## 干支と方角

江戸時代は方角も30度角の12方向を北から時計回りで十二支で割り当てていました。

24方向（15度角）の場合は、増えた12方向のうち45度倍角の4方向は、八卦の方位を用い、訓読みは左右の十二支の読みを合体させます。「乾」＝「戌＋亥」で「いぬい」、「巽」＝「辰＋巳」で「たつみ」と読ませるのはそのためです。

そして、残りの8方向は、十干を用います。

「子午線」、「正午」、「正子」など、現代の天文・時間用語にも十二支由来があります。操舵の「取舵」「面舵」は、それぞれ「酉（への）舵」、「卯（への）舵」が変化したものと言われています。


# cal-japan.el

[cal-japan.el](https://github.com/kawabata/cal-japan) は、Emacs calendarのフレームワークを使った、「日本暦日原典」の月の大小による和暦と、干支・元号の実装を目指したものです。月の大小データとして、[when.exe](http://www2u.biglobe.ne.jp/~suchowan/when_exe_wiki.html) の「アルファベット」表記データを利用させてもらっています。たとえば1873年は、 "abCdEfFGhIJkL" ですが、これは、3月・5月・閏6月・7月・9月・12月が大の月であることを示します。以下に設定例を示します。

```el
(require 'cal-japan)
(define-key calendar-mode-map "pJ" calendar-japanese-print-date)
(define-key calendar-mode-map "gJ" calendar-japanese-goto-date)
```

例として、日本で最初の時計（漏刻）が導入されたことを記す日本書紀[２７巻「天智天皇紀」１０年の記述](https://dl.ndl.go.jp/pid/991091/1/250)を確認します。

> 夏四月丁卯朔。辛卯。置漏剋於新臺。始打候時動鍾鼓。始用漏剋。此漏剋者天皇爲皇太子時。始親所製造也云々。

`M-x calendar` にて、 `g J` と入力し、次に<天智> を選び、10年、4月を選びます。

すると、ミニバッファに現れる「日」の選択肢の1日が「丁卯」となっており、上記の記述「丁卯朔」（朔は１日の意味）と一致します。１日が「丁卯（ひのとのう）」なので、同じ十二支である「辛卯（かのとのう）」は、十干が２つずれて 12×2日先にあるはずです。そのあたりを探すと、25日が「辛卯」です。この25日を選択すると、カレンダーが西暦671年6月10日に移動します。これが「[時の記念日](http://ja.wikipedia.org/wiki/時の記念日)」６月１０日の由来です。


# 【参考】讖緯説と西暦445年

日本書記で初期の歴代天皇を100歳以上生存させたと言われる「讖緯説」ですが、由来となったはずの中国では、根拠となる文献はほとんど残されていません。

日本書紀の成立から2世紀以上たった961年、三善清行「[革命勘文](http://ja.wikipedia.org/wiki/革命勘文)」（『[群書類従](http://ja.wikipedia.org/wiki/群書類従)』第26集[雑部](https://dl.ndl.go.jp/info:ndljp/pid/2576275/91)）に、[鄭玄](http://ja.wikipedia.org/wiki/鄭玄)の『易緯』・『詩緯』を引いて、神武天皇から推古天皇までの年数が一蔀 1320年 となることが述べられ、日本書記の年代が故意に引き延ばされた可能性を示唆しています。

この革命勘文以降、およそ900年にわたって、数回の例外を除いて辛酉の年と、その4年後の甲子の年には、践祚や災害がなくても改元することになりました。そのため、明治以前は同じ元号で年干支がで重複することはありませんでした。

| 西暦 | 辛酉革命| 甲子革令|
|-----:|:------|:------|
| 961  | 天徳→応和| 応和→康保|
| 1021 | 寛仁→治安| 治安→万寿|
| 1021 | 寛仁→治安| 改元なし|
| 1081 | 承暦→永保| 永保→応徳|
| 1141 | 保延→永治| 康治→天養|
| 1201 | 正治→建仁| 建仁→元久|
| 1261 | 文応→弘長| 弘長→文永|
| 1321 | 元応→元亨| 元亨→正中|
| 1381 | 天授→弘和| 弘和→元中|
|      | 康暦→永徳| 永徳→至徳|
| 1441 | 永享→嘉吉| 嘉吉→文安|
| 1501 | 明応→文亀| 文亀→永正|
| 1561 | 改元なし| 改元なし|
| 1621 | 改元なし| 元和→寛永|
| 1681 | 延宝→天和| 天和→貞享|
| 1741 | 元文→寛保| 寛保→延享|
| 1801 | 寛政→享和| 享和→文化|
| 1861 | 万延→文久| 文久→元治|

「日本書紀」は紀元前660年からの日付が干支で記録されており、これに基づいて2000年以上の「長暦」を求めようとする研究者は明治以前よりいました。しかし、神武天皇から允恭天皇にかけての記録における、朔と日干支の関係は長らくはっきりしませんでした。

1938年、天文学者 [小川清彦](https://ja.wikipedia.org/wiki/小川清彦_(天文学者))は、[西暦454年以前の日本書紀の暦](https://eco.mtk.nao.ac.jp/koyomi/wiki/C2C0B1A2C2C0CDDBCEF12FC6FCCBDCA4CECEF1C6FCA5C7A1BCA5BFA5D9A1BCA5B9.html#e648eb3a)は、当時存在しないはずの[儀鳳暦](https://eco.mtk.nao.ac.jp/koyomi/wiki/B5B7CBB1CEF1.html)を[平朔で逆算して当てはめていることを発見](http://fomalhautpsa.sakura.ne.jp/Science/OgawaKiyohiko/shoki-rekijyutu.pdf)しました。しかし、この発見は戦前に発表することはできませんでした。日本書記の日付が虚構であることを公に言い出すと、[社会から抹殺](https://ja.wikipedia.org/wiki/津田左右吉#津田事件)されかねなかったからです。80年前の日本はそんな「1984年」ばりのディストピア社会でした。

戦後、この発見は公表され、すぐに定説となりました。これに従い「日本暦日原典」は暦表を西暦445年から始め、本書に倣った和暦の実装もまた、西暦445年（安康天皇からならば454年）から対応するのが一般的となりました。

小川清彦の発見はまた、紀元前660年から454年までは、日本書紀だけで通用する暦を矛盾なく構築できることを示しました。この1100年間の暦を実際に計算して出版したのが[内田正男『日本書紀暦日原典』(雄山閣) 1978](https://www.amazon.co.jp//dp/4639011830)であり、これを計算機で実装したのが国立天文台の[日本の暦日データベース](https://eco.mtk.nao.ac.jp/cgi-bin/koyomi/caldb.cgi)です。


# 【参考】Emacs用の各国の休日パッケージ

MELPAには多くのカレンダーに関するパッケージがあります。calendarの代替としては、kiwanami氏の[calfw](https://kiwanami.hatenadiary.org/entry/20110107/1294404952)は有名です。また、下記の各国の休日のパッケージが提供されています。

| belarus-holidays      | 白ロシア       |
|:----------------------|:---------------|
| brazilian-holidays    | ブラジル       |
| czech-holidays        | チェコ         |
| german-holidays       | ドイツ         |
| hungarian-holidays    | ハンガリー     |
| japanese-holidays     | 日本           |
| korean-holidays       | 韓国           |
| mexican-holidays      | メキシコ       |
| netherlands-holidays  | オランダ       |
| nz-holidays           | ニュージーランド|
| russian-holidays      | ロシア         |
| slovak-holidays       | スロバキア     |
| suomalainen-kalenteri | フィンランド   |
| swiss-holidays        | スイス         |
| ukrainian-holidays    | ウクライナ     |

[EmacsWikiの「各国のカレンダー」](https://www.emacswiki.org/emacs/CalendarLocalization)には、その他の国々へのカスタマイズ情報があります。


# 【参考】暦と星座と黄道十二宮と二十八宿・二十七宿

暦を決めるにあたり天体、特に黄道の観測は不可欠で、便宜上、黄道を分割する概念が生まれました。

黄道円を12分割するのが古代バビロニアの[黄道十二宮](https://eco.mtk.nao.ac.jp/koyomi/wiki/B2ABC6BBBDBDC6F3B5DC.html)です。これは、太陽が毎月動く場所に合わせています。

黄道円（白道円）を27または28分割するのが[二十七宿](https://eco.mtk.nao.ac.jp/koyomi/wiki/C6F3BDBDC8ACBDC9.html)または二十八宿です。これは月（公転周期27.3日）が毎日動く場所に合わせています。

黄道を分割するにあたり、各分割点にある明るい星を目印にしました。黄道十二宮の場合は後にこれが「星座」に変化し（[黄道十二星座](https://ja.wikipedia.org/wiki/黄道十二星座)）、二十八宿にも該当する星座が中国にありました。

しかしながら、「恒星」を目印にすると歳差運動により恒星年と回帰年は、72年に1度ずつずれていきます。古代バビロニアでの黄道12宮の星座と、今の黄道の星座はちょうど一座ほどずれています。

また、春分を新年とするはずのイラン暦とヒンズー暦・仏暦が、4世紀頃は同じ新年だったのに、今では仏暦が一ヶ月近く遅れているのも同様の理由です。

なお、惑星名に基づく「曜日」の概念も同様に古代バビロニアから、ヨーロッパ・インドに伝播し、さらに平安時代に日本に伝わったものです。土曜日＝Saturday（Saturn's Day=土星の日）、日曜日＝Sunday（Sun's Day=太陽の日）、月曜日＝Monday（Moon's Day=月の日）などが英語と日本語で一致するのはそのためです。


# 【参考】暦注と八将神

平安時代から明治初期にかけては、和暦には「暦注」と「[八将神](https://ja.wikipedia.org/wiki/八将神)」の方向が記されていました。

[江戸時代暦復元プロジェクト](http://www.asahi-net.or.jp/~jc1y-ishr/Kyuureki/EdoCalendar) には、国会図書館デジタルライブラリで公開されている江戸時代の200年分の暦と暦注が整理されています。当時の暦は、かならず表紙に八将神の方向が記入されています。暦注には、太陽暦に基づく「[二十四節気](http://ja.wikipedia.org/wiki/二十四節気)」や「[雑節](https://eco.mtk.nao.ac.jp/koyomi/wiki/B5A8C0E12FBBA8C0E1A4C8A4CFA1A9.html)」（節分・土用・彼岸・八十八夜や社日など）、太陰暦に基づく「[五節句](http://ja.wikipedia.org/wiki/五節句)」（人日・上巳・端午・七夕・重陽）、占いに用いる「[二十八宿](https://eco.mtk.nao.ac.jp/koyomi/wiki/C6F3BDBDC8ACBDC9.html)」・「[六曜](http://ja.wikipedia.org/wiki/六曜)」・「[十二直](http://ja.wikipedia.org/wiki/十二直)」・「[納音](http://ja.wikipedia.org/wiki/納音)」・「[五行](http://ja.wikipedia.org/wiki/五行)」などがあります。

こういった暦注が年中行事や休日、人々の生活慣習を規定していました。

暦注のうち、太陽暦に基づくものはグレゴリオ暦へスムーズに移行できますが、太陰暦に基づくものは、一部は廃れ、一部は[月遅れ](http://ja.wikipedia.org/wiki/月遅れ)となり、一部は日付をそのまま新暦に移しました。

東京では他地方よりも一ヶ月早くお盆になったり、仙台は七夕を8月に祝うのは、月遅れの地方差によります。

暦注のうち、「十二直」・「納音」のような占いに類するものは、明治以降は迷信と排斥されました。残った「六曜」は、他が廃れた分、逆に大きな注目が集まり現在でも結婚式などの日取りなどに使われるようになってしまいました。

「[二十八宿](https://eco.mtk.nao.ac.jp/koyomi/wiki/C6F3BDBDC8ACBDC9.html)」のような天文に関する占いが明治以降、排斥されたその空隙を、今は西洋占星術が占めるようになっています。


# 【参考】暦と時間

「暦法」はまた、「時間」や日の切り替わる時間も規定します。

ユダヤ暦・イスラム暦では一日は日の入の時刻をもって変わります。ユリウス日は天文観測に使われるため、UTCにおける昼の正午に一日が切り替わります。ヒンズー暦、そして旧暦の日本では、日の出をもって一日の切り替わりとしていました。

つまり、深夜12時から日の出までにおきるイベントでは、和暦とグレゴリオ暦で1日ずれます。普通はこんな時間、みんな寝ているのであまり問題にはならない筈なのですが、江戸時代には、深夜4時におきた歴史的事件があります。

最初に例を挙げた、和暦と西暦の違いでよく[言及される](https://www.buzzfeed.com/jp/tatsunoritokushige/chushingura)、「赤穂浪士の討ち入り事件」です。本所「吉良邸」へ赤穂浪士がなだれ込んだのは「元禄15年12月14日寅の上刻」です。

「元禄15年12月14日」は、「西暦1703年1月30日」ですが、「元禄15年12月14日寅の上刻」は「西暦1703年1月31日午前4時頃」になります。ところが、Wikipediaも多くの資料も、この事件の起きた日付を「西暦1703年1月30日」としています。まぁ今でも「27時閉店」のお店とかありますし、あまり気にする人は多くないかもしれません。

宣明暦の頃の日本では、1日 = 12時辰（不定時） = 100刻（定時） = 8400分で、１分＝８秒としていました。当時の1秒は、現在の1.2857秒に相当しますが、この類似は偶然です。当時の「秒」は主に暦の計算で使われていました。

「[十二時辰](https://ja.wikipedia.org/wiki/十二時辰)」は[時代に応じて](https://ja.wikipedia.org/wiki/十二時辰#時辰の細分)、二分割・三分割または四分割されていました。「寅の上刻」の「上刻」は、「時辰」が「上・中・下」の三分割されていた時代の表記法です。

江戸時代の暦には、二十四節気ごとに、1日を100刻にわけたうちの昼夜の時間配分が書かれていました。たとえば、[安政7年](https://dl.ndl.go.jp/info:ndljp/pid/2546787/65)の暦を見ると、立春では昼と夜の時間は43.5:56.5の比率とあります。その配分に応じて、昼と夜をさらにそれぞれ6分割して、12時辰としていました。和時計の機構を解説した[「機巧図彙」の最初のページ](https://dl.ndl.go.jp/pid/2568591/1/2)には、等時間隔で往復回転運動する機構である「天桴の錘にて日々昼夜の長短の加減をする」ことで不定時法に対応すると書かれています。天桴には二十四節気に合わせて[２４の溝](https://dl.ndl.go.jp/pid/2568591/1/8) が掘られていました。ただ、毎日２回、錘を調整するのは煩雑なため、１７世紀後半には昼夜の錘を事前に設定した[２つの天桴を自動的に切り替える](https://www.youtube.com/watch?v=eLldi0qMea8) 機構が発明されています。

ぜんまい時計がヨーロッパから伝わったのは戦国時代です。江戸時代は、大名や大きな寺院は、からくり時計や香盤時計を用いて、暦にかかれた比率で時間を計り、寺鐘・城鐘をならして庶民に時間を知らせていたようです。


# 【参考】暦と絵文字

現在の絵文字の元祖となった、ドコモの絵文字には、十二支の動物が含まれていました。

十二支は、中国文化圏を越えてアジアの全域に影響を及ぼしているため、各国で動物が異なります。日本のドコモの絵文字の十二支をUnicodeに追加する際、Unicode Consortium は世界各国で十二支にあてがわれる動物を調査し、その結果、[広範な国の動物](http://www.unicode.org/charts/PDF/U1F300.pdf#page=9)を追加することになりました。

| 十二支| 日本   | 中国    | ベトナム | イラン  | カザフスタン | タイ  |
|:------|:-------|:--------|:---------|:--------|:-------------|:------|
| 子    | 🐁 (🐭)|         |          | 🐀      |              |       |
| 丑    | 🐄 (🐮)| 🐂      | 🐃       | 🐄      |              |       |
| 寅    | 🐅 (🐯)|         |          | 🐆      |              |       |
| 卯    | 🐇 (🐰)|         | 🐈 (🐱)  |         |              |       |
| 辰    | 🐉 (🐲)|         |          | 🐊/🐋   | 🐌           |       |
| 巳    | 🐍     |         |          |         |              |       |
| 午    | 🐎 (🐴)|         |          |         |              |       |
| 未    | 🐑     | 🐏      | 🐐       | 🐑      | 🐏           | 🐐    |
| 申    | 🐒(🐵) |         |          |         |              |       |
| 酉    | 🐔     | 🐓      | 🐓       | 🐓      | 🐔           | 🐓    |
| 戌    | 🐕(🐶) |         |          |         |              |       |
| 亥    | 🐗     | 🐖 (🐷) | 🐖 (🐷)  | 🐖 (🐷) | 🐖 (🐷)      | 🐘/🐖 |

（日本・中国と同じ動物は省略）

少数民族を含めると、このバリエーションはさらに多彩となることが知られています。

月の満ち欠けも絵文字となっています。

| 日本語    |    | 英語             |
|:----------|:---|:-----------------|
| 朔（新月）| 🌑 | new moon         |
| 三日月    | 🌒 | waxing crescent  |
| 上弦      | 🌓 | waxing half moon |
| 十三夜    | 🌔 | waxing gibbous   |
| 望（満月）| 🌕 | full moon        |
| 十八夜    | 🌖 | waning gibbous   |
| 下弦      | 🌗 | waning half moon |
| 二十六夜  | 🌘 | waning crescent  |

黄道十二宮も絵文字になっており、全てに U+FE0F Variation Selector が登録されています。

| 正式名| ラテン語    | 星座     |    |    | 黄経     |
|:----|:------------|:---------|:---|:---|:---------|
| 白羊宮| Aries       | おひつじ座| ♈︎ | ♈️ | 0–30°    |
| 金牛宮| Taurus      | おうし座 | ♉︎ | ♉️ | 30–60°   |
| 双児宮| Gemini      | ふたご座 | ♊︎ | ♊️ | 60–90°   |
| 巨蟹宮| Cancer      | かに座   | ♋︎ | ♋️ | 90–120°  |
| 獅子宮| Leo         | しし座   | ♌︎ | ♌️ | 120–150° |
| 処女宮| Virgo       | おとめ座 | ♍︎ | ♍️ | 150–180° |
| 天秤宮| Libra       | てんびん座| ♎︎ | ♎️ | 180–210° |
| 天蝎宮| Scorpio     | さそり座 | ♏︎ | ♏️ | 210–240° |
| 人馬宮| Sagittarius | いて座   | ♐︎ | ♐️ | 240–270° |
| 磨羯宮| Capricorn   | やぎ座   | ♑︎ | ♑️ | 270–300° |
| 宝瓶宮| Aquarius    | みずがめ座| ♒︎ | ♒️ | 300–330° |
| 双魚宮| Pisces      | うお座   | ♓︎ | ♓️ | 330–360° |


# 【参考】東アジア・東南アジアの旧暦と旧正月

旧暦（太陽太陰暦）は、多くの東アジア・東南アジア各国で、[旧正月](https://ja.wikipedia.org/wiki/旧正月)や仏教関係の記念日などを求めるのに使われます。

アジアの旧暦は大きく2種類に大別されます。

一つは、冬至を含む月を11月をとする、時憲暦（中国）・天保暦（日本）・ベトナム暦・内蒙古モンゴル暦・モンゴル暦・チベット暦など「中国文化圏」または「[北伝仏教](http://ja.wikipedia.org/wiki/北伝仏教)圏」の暦です。これらの地域では、新年の最初の新月を「正月」として盛大に祝います。

もう一つは、黄道に白羊宮（Meṣa）が入る時期を新年とする、タイ太陰暦・ビルマ暦・バリ暦・バングラデシュ暦などの「[南伝仏教](http://ja.wikipedia.org/wiki/南伝仏教)圏」の仏暦です。これらの地域では、新月の日は特に祝わず、[恒星年](https://eco.mtk.nao.ac.jp/koyomi/wiki/B5A8C0E12FB5A8C0E1A4CEA4E1A4B0A4EAA4CEBCFEB4FC.html) (sidereal) の黄道十二宮が白羊宮になる4月14日前後に盛大に祝います（タイの[ソンクラーン](https://ja.wikipedia.org/wiki/ソンクラーン)や、ミャンマーの[ティンジャン](https://en.wikipedia.org/wiki/Thingyan)）。

南伝仏教圏の仏暦の新年は、[歳差運動](https://eco.mtk.nao.ac.jp/koyomi/wiki/BAD0BAB9.html)により回帰年と徐々に日付がずれていきます。6世紀頃は3月下旬が正月でしたが、17世紀には4月9日頃、21世紀は4月15日頃が正月となります。すなわち、1500年の間に、およそ3週間ほど仏事・正月の日が東アジアとずれました。

新年を含む月の翌月の満月を灌仏会とするのは東南アジアの国々で共通しているため、東南アジアで共通して祝えるよう、[国際ウェーサーカ祭日](https://ja.wikipedia.org/wiki/ウェーサーカ祭#国連ウェーサクの日祝祭)が制定されました。

同様に、東アジアでも[旧暦の共通化を求める声](http://naagita.hatenablog.com/entry/2019/03/21/131714)があがることがあります。とはいえ、日本・ベトナムとも、中国が管理する暦を自国で使うのを好まないため、[旧暦の国際共通化は困難](https://ja.wikipedia.org/wiki/旧正月#日本と中国、ベトナムでの日付の違い)と言われていました。

ただし、日本・ベトナムの子午線は中国と1時間しかずれていないため、旧正月の日付が中国とずれるのは、せいぜい20～30年に1回程度です。また、中国政府が旧暦を管理している、とは言われていても、旧暦の日程は天文計算によって今後数十年先まで正確に求められており、これらが故意にねじ曲げられることは考えにくいです。

そして、中国の旧正月は、シンガポール・マレーシア、さらには遠くニューヨークの学校休日にまで影響を及ぼしています。

いっそのこと、世界標準時 UTC+0を子午線とした「世界太陽太陰暦」を、各国共通で用いることができればいいのになぁ、とも思いますが、今は中国基準の春節が世界の多くの国の祝日となっているので、難しいでしょう。


# 【参考】旧暦2033年問題

天保暦は、地球の楕円公転軌道（離心率3%）の角度に基づき中気を決めるため、平均30.5日である中気の間隔は、近日点（1月上旬）付近では29.5日まで縮まります。

一方、月の楕円軌道はおよそ8周年で地球を周回します。遠地点で朔になる場合は、平均29.5日の朔望月長は最大29.8日まで伸びます。

この2つが間隔が逆転すると、本来は3年に1度程度しか現れない「中気のない月」が、1年に2回、起こることがあります。このようなケースは、40年に1回程度しかありません。

天保暦は、もしも一年の中に中気のない月が2つできてしまった場合は、「まず二至二分を2月・5月・8月・11月に固定し、その間が3ヶ月になる中気がない月を閏月とする」という[ルールを設けました](https://dl.ndl.go.jp/pid/2552837/1/12)。

このルールは、二至二分の間は2ヶ月か3ヶ月であることを前提としています。

ところが2033年には、近日点付近における月の遠地点の朔と節気がピッタリのタイミングに重なり、結果として秋分と冬至を含む月の間の月は1ヶ月しかない、という天保暦の想定外の事態が発生します。しかも、もはや天保暦は政府の管理下を離れているため、この場合の対処方法を公的に決める機関はありません。

実際に確認してみます。まず、2033年の秋分の日の直前 (9/20) から、冬至の日の直後 (12/23) までの、朔と中気を求めます。

```el
(defun date-time-string (d)
  (let* ((floor (floor d))
         (time (- d floor)))
    (concat (calendar-date-string (calendar-gregorian-from-absolute floor)) " "
            (solar-time-string (* time 24) nil))))

(defun new-moon-on-or-after (d)
  (calendar-astro-to-absolute
   (lunar-new-moon-on-or-after (calendar-astro-from-absolute d))))

(defun chuki-on-or-after (d)
  (calendar-astro-to-absolute
   (solar-date-next-longitude (calendar-astro-from-absolute d) 30)))

(defun month-list (start end func)
  (if (<= start end)
      (let ((new-moon (funcall func start)))
        (if (<= new-moon end)
            (cons new-moon
                  (month-list (1+ new-moon) end func))))))

;; 2033年9月20日～12月23日の朔を求める
(mapcar 'date-time-string
        (month-list
         (calendar-absolute-from-gregorian '(09 20 2033))
         (calendar-absolute-from-gregorian '(12 23 2033))
         'new-moon-on-or-after))
("2033-09-23 10:39pm" "2033-10-23 4:27pm" "2033-11-22 10:38am" "2033-12-22 3:45am")

;; 2033年9月20日～12月23日の中気を求める
(mapcar 'date-time-string
        (month-list
         (calendar-absolute-from-gregorian '(09 20 2033))
         (calendar-absolute-from-gregorian '(12 23 2033))
         'chuki-on-or-after))
("2033-09-23 1:51am" "2033-10-23 11:26am" "2033-11-22 9:14am" "2033-12-21 10:44pm")
```

すなわち、以下のようになり、確かに秋分と冬至の間に1ヶ月しかありません。

| 朔                 | 中気                                             |
|:-------------------|:-------------------------------------------------|
| 2033-09-23 10:39pm | 2033-09-23 1:51am （秋分）                       |
| 2033-10-23 4:27pm  | 2033-10-23 11:26am                               |
| 2033-11-22 10:38am | 2033-11-22 9:14am ,  2033-12-21 10:44pm （冬至） |
| 2033-12-22 3:45am  |                                                  |

これが[旧暦2033年問題](https://eco.mtk.nao.ac.jp/koyomi/topics/html/topics2014.html)ですが、良く見ると、なんと秋分は朔より21時間ほど早くきています。それでも、「同じ日であること」というルールにより、秋分はその朔の月に含められてしまいます。秋分があと2時間早いか、朔があと1時間遅ければ、この問題は起きませんでした。また、冬至と次の朔は5時間しか差がありません。この5時間が同じ日であれば、この問題は起きませんでしたが、その5時間に正子が跨がり、別の月になってしまうのです。

この問題、古代中国の暦の成り立ちの原点に振り返れば、[日本カレンダー暦文化振興会](https://www.rekibunkyo.or.jp/year2033problem.html)が提唱している、「冬至を含む月は11月」を最優先し、「11月から次の11月が13ヶ月の場合は、最初の中気を含まない月が閏月」という規則で決めなおすのでほぼ確定かと思われます。現代社会では、秋分や春分が8月や2月でなくても気にする人は少ないでしょう。

ただし、このルールを前面に押し出すと、「冬至と春分の間に中気がない月を含む2ヶ月があり、春分と夏至の間に中気のない月を含む3ヶ月がある」というケースでは、本来なら春分と夏至の間の中気がない月を閏月にすればうまくいくのに、冬至と春分の間にある中気のない月が閏月に割り当てられてしまいます。そのため、優先順はやはり考える必要があります。このようなケースは実際に[1851年にありました](https://eco.mtk.nao.ac.jp/koyomi/wiki/C2C0B1A2C2C0CDDBCEF12FC4EAB5A4CBA1A4CEB1C6B6C1.html#cac4f448)。


# 最後に

ぶっちゃけて言えば、和暦・元号は実装し始めるとあちこち分からない点が出てきます。

そして調べ出すととてもめんどくさいです。

なので、ハマらないためには、せいぜいグレゴリオ暦と一致する1873年以降だけサポートし、某OSのようにそれより昔には手を出さない方が無難です。

しかし、きちんと理解して実装したい方のために、一応、長暦の現状と簡単な実装を紹介しました。月の大小データと元号データを除いたロジック部分はコードで200行程度です。

参考になれば幸いです。

solar.el や lunar.el は、暦を定める天文計算を行う便利なツールを用意しています。これを使って、自分だけの暦を作ってみて、それを使った異世界小説でも書いてみるのはいかがでしょうか ;->

（異世界転生したら日本語が通じないことを気にしている小説は多いのに、暦が違うことを気にしている小説はなぜかほとんどない。）


# 参考資料

和暦の話は歴史や日常の慣習と関連付けられるため、日本語だけでも数え切れないほどのネット情報・文献・論文があります。以下にいくつかを紹介します。


## 書籍


### 内田正男『日本暦日原典』(雄山閣出版) 1975

長暦の決定版であり、計算機で和暦を実装する際に、その仕組みを理解するための[必須の書](https://ja.wikipedia.org/wiki/日本暦日原典)です。これ以前の長暦は、神武天皇の即位紀元（紀元前660年）から計算するのが定番でしたが、本書は上述した理由により西暦445年から始めています。


### 内田正男『日本書紀暦日原典』(雄山閣出版) 1978

小川清彦の説を証明するために、日本書紀の神武即位以降の1100年以上の暦を計算機で計算・印刷してそのまま出版した書籍です。本書と上記の書で合わせて、紀元前660年から現代までの長暦を構成します。


### 内田正男『暦のはなし十二カ月』(雄山閣出版) 1991、『暦の語る日本の歴史』(吉川弘文館) 2012

内田博士の一般向けの書籍も、話題は非常に幅広く面白いです。ご本人は来年100歳になります。


### 藪内清『藪内清著作集 (1) 定本 中国の天文暦法』

和暦の暦法について、日本人があたらしく創造したことはほとんどありません。干支、24節気、朔、章法、定気法、etc. etc、アジアの暦の基礎はすべて古代中国で作られ、それが東アジアに広まってローカライズされました。その中国で、どのように暦の仕組みが発達していったのかを研究した本です。


### 広瀬秀夫『日本史小百科・暦』1978

やや古い本ですが、日本史と暦に関わる様々なトピックを2ページでまとめているため読みやすく、本書をきっかけに暦に興味を持った方は多いようです。巻末に長暦が分かりやすく付録されており、本書をOCRしてもコンピュータでの長暦を作成できます。


### 細井浩志 『日本史を学ぶための〈古代の暦〉入門』

日本の古い文献を読む際に、長暦がどのように役立つかが分かりやすく解説されています。このような文献を読むと、手元にコンピュータで自由自在に扱える和暦のライブラリを持っておくことの大切さを実感できます。


### 山下克明『平安貴族社会と具注暦 (日記で読む日本史) 』2017/8/7


### 中牧弘允『世界の暦文化事典』 (丸善出版) ・『世界をよみとく「暦」の不思議』 (イースト出版）

世界中の様々な暦を紹介した本です。前者は事典の形で国ごとに詳細な暦・休日を解説していて、後者は雑学的に読みやすく世界の暦事情をまとめられています。海外旅行に行かれる方は、ぜひ事前に旅行先のカレンダー事情を読んでみると面白いと思います。


### Edward M. Reingold, Nachum Dershowitz“Calendrical Calculations”(March 2018)

Emacs の Calendar を実装した [Edward M. Reingold](https://en.wikipedia.org/wiki/Edward_Reingold) は、1990年代初頭に、暦計算プログラムを Emacs へ寄付しました。その後も精力的に様々な暦の研究を続け、2018年に最新の成果を [Calendrical Calcuations The Ultimate Edition](https://www.amazon.com/dp/B07VN98S7W) として出版しました。本書とEmacsの関係については、[calendar.elの冒頭のコメント](https://git.savannah.gnu.org/cgit/emacs.git/tree/lisp/calendar/calendar.el#n78)にまとめられています。

本書のD章には、Emacsでサポートされている暦以外にも、[バリ暦](https://repository.kulib.kyoto-u.ac.jp/dspace/bitstream/2433/65016/1/450401.pdf)・[チベット暦](https://ja.wikipedia.org/wiki/チベット暦)などの実装が、Common Lisp で記述されています。ただし、本書に掲載されているアルゴリズムの一部は特許が取得されており、[パブリックドメインではありません](https://lists.gnu.org/archive/html/emacs-devel/2011-06/msg00408.html)。


## 国立天文台 暦計算室 (<https://eco.mtk.nao.ac.jp/koyomi/>)

-   **暦Wiki:** <https://eco.mtk.nao.ac.jp/koyomi/wiki/>
-   **暦要綱:** <https://eco.mtk.nao.ac.jp/koyomi/yoko/index.html>
-   **こよみ用語解説:** <https://eco.mtk.nao.ac.jp/koyomi/faq/60kansi.html>
-   **貴重資料展示室:** <https://eco.mtk.nao.ac.jp/koyomi/exhibition/>
-   **今月のこよみ powered by Google Calendar:** <https://eco.mtk.nao.ac.jp/koyomi/cande/calendar.html>
    -   右下をクリックすると、自分のGoogle Calendarへインポート可能
    -   さらに各カレンダーのIDを取得すれば、 cfw:ical-create-source で、calfwにインポート可能。


## github の参考レポジトリ


### suchowan/when\_exe

世界各国の暦を、統一アーキテクチャで表現しようとする試みです。cal-japan.el の月の大小データはここの [japanese/calendar.rb](https://github.com/suchowan/when_exe/blob/master/lib/when_exe/region/japanese/calendars.rb) を利用させてもらっています。[メインページ](http://www2u.biglobe.ne.jp/~suchowan/when_exe_wiki.html)からは、[変換ページ hosi.org](http://hosi.org:3000/index.html) にも行けます。


### github.com/manakai

日本の主要なカレンダーイベントなどをデータベース化したものです。


## 国会図書館デジタルライブラリ

明治以前の暦が多数、公開されていて、和暦実装の検証に役立ちます。中国の古い暦もいくつかあります。

-   **元亨4年 (1324):** <https://dl.ndl.go.jp/info:ndljp/pid/2540879>
-   **応安5年 (1372):** <https://dl.ndl.go.jp/info:ndljp/pid/2570143>
-   **明徳元年 (1390):** <https://iss.ndl.go.jp/books/R100000039-I000118666-00>
-   **応永4年 (1397):** <https://dl.ndl.go.jp/info:ndljp/pid/2585025>
-   **応永32年 (1425):** <https://iss.ndl.go.jp/books/R000000004-I024112874-00>
-   **天文2年 (1533):** <https://dl.ndl.go.jp/info:ndljp/pid/1288393>
-   **慶長12年 (1607):** <https://dl.ndl.go.jp/info:ndljp/pid/2534317>
-   **寛文10年-貞享五年 (1670-1688):** <https://dl.ndl.go.jp/info:ndljp/pid/2546782>
-   **1685-1874年:** <http://www.asahi-net.or.jp/~jc1y-ishr/Kyuureki/EdoCalendar/>
-   **貞明八年（中国）:** <https://iss.ndl.go.jp/books/R100000002-I000007561767-00>
-   **顯徳二年（中国）:** <https://iss.ndl.go.jp/books/R100000039-I000027069-00>