Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
和暦を正しく扱うための暦の話
Search
nagise
January 21, 2023
Programming
11
8.9k
和暦を正しく扱うための暦の話
burikaigi 2023 の懇親会で発表したセッションの資料です。
日本では明治6年(1873)よりグレゴリオ暦が採用されましたが、それ以前の年代での和暦の扱いについて注意点をまとめたものです。
nagise
January 21, 2023
Tweet
Share
More Decks by nagise
See All by nagise
Java ジェネリクス入門 2024
nagise
0
740
Project Valhalla 2023 中間報告 - JJUG 2023/03/30
nagise
0
250
Other Decks in Programming
See All in Programming
アジャイルを支えるテストアーキテクチャ設計/Test Architecting for Agile
goyoki
9
3.3k
見せてあげますよ、「本物のLaravel批判」ってやつを。
77web
7
7.7k
Quine, Polyglot, 良いコード
qnighy
4
640
AI時代におけるSRE、 あるいはエンジニアの生存戦略
pyama86
6
1.1k
Pinia Colada が実現するスマートな非同期処理
naokihaba
4
220
Better Code Design in PHP
afilina
PRO
0
120
ふかぼれ!CSSセレクターモジュール / Fukabore! CSS Selectors Module
petamoriken
0
150
ヤプリ新卒SREの オンボーディング
masaki12
0
130
NSOutlineView何もわからん:( 前編 / I Don't Understand About NSOutlineView :( Pt. 1
usagimaru
0
330
初めてDefinitelyTypedにPRを出した話
syumai
0
400
とにかくAWS GameDay!AWSは世界の共通言語! / Anyway, AWS GameDay! AWS is the world's lingua franca!
seike460
PRO
1
860
Amazon Qを使ってIaCを触ろう!
maruto
0
400
Featured
See All Featured
Dealing with People You Can't Stand - Big Design 2015
cassininazir
364
24k
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
27
840
Designing for humans not robots
tammielis
250
25k
Large-scale JavaScript Application Architecture
addyosmani
510
110k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
126
18k
RailsConf 2023
tenderlove
29
900
Fontdeck: Realign not Redesign
paulrobertlloyd
82
5.2k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
What's new in Ruby 2.0
geeforr
343
31k
Designing Experiences People Love
moore
138
23k
Building a Scalable Design System with Sketch
lauravandoore
459
33k
Transcript
和暦を正しく扱うための 暦の話 Burikaigi 2023 @nagise なぎせゆうき
和暦クイズ 日本の暦における1年の日数は? ※692年~2023年
和暦クイズの答え 1年の日数もいろいろあります! 日本暦日原典の記述を基にnagiseが編集した
日本で用いられた暦法 国立天文台 暦Wiki より https://eco.mtk.nao.ac.jp/koyomi/wiki/CEF2BBCB2FC6FCCBDCA4CECEF1.html
年の区切り問題 《赤穂浪士の討ち入りの日を「元禄15年(1702年)12月14日」 とするのを見ることがあるが、元禄15年12月はグレゴリオ暦で は1703年の1月~2月に当たるので、1702年とするのは不適切で ある。またグレゴリオ暦の日付では元禄15年の12月14日は1月30 日にあたるが、討ち入りしたとき既に深夜0時を過ぎていたので、 討ち入りは「1月31日」の出来事になる[8]。よって赤穂浪士の討 入りの日付を文献史料などに記載する場合には、「元禄15年12 月14日(1703年1月31日未明)」とするのが最も適切である》 https://ja.wikipedia.org/wiki/%E5%A4%AA%E9%99%B0%E5%
A4%AA%E9%99%BD%E6%9A%A6
ISO 8601 • 日付と時刻の表記に関するISOの国際規格 • グレゴリオ暦で過去に遡って適用(先発グレゴリオ暦) • コンピュータ上での扱いはISO準拠が無難 • しかし表示上は利用者の文化にあわせて表示する必要がある
• ISOでは紀元0年が存在するので史実のユリウス暦などとすり合 わせる際には気を付ける
太陽暦 • 地球が太陽のまわりを回る周期(太陽年)を基にしている • 太陽年は約365.2422日であるため、1年をおよそ365日とし、閏 年を設け端数を処理する方法が取られる • 月の満ち欠け → ガン無視
暦法 閏年 1年の長さ(平均) ユリウス暦 4年に1回 365.25日 グレゴリオ暦 400年に97回 365.2425日
ユリウス暦 • 日本では正式な暦として用いられたことはない • 古い時代の暦日の基準として用いられることがある • ガイウス・ユリウス・カエサルにより紀元前45年1月1日より ローマにて行用 • 初期に閏年が誤って3年に1回で運用されたりと混乱がみられる
• java.util.GregorianCalendar は1582年10月15日より前はユリウ ス暦として動く
グレゴリオ暦 • ローマ教皇グレゴリウス13世がユリウス暦の改良を命じ、1582 年10月15日金曜日から行用 • 年が4で割り切れる年が閏年 • ただし、年が100で割り切れる場合は平年 • ただし、年が400で割り切れる場合は閏年
• 400年に97回の閏年 • 閏日2月29日はコンピュータシステム上、バグが生じやすい日 • 1582年以前に対して遡って適用するものを先発グレゴリオ暦と いう。ISO 8601も先発グレゴリオ暦
ユリウス暦とグレゴリオ暦の切り替わり • ユリウス暦1582年10月4日(木)の翌日がグレゴリオ暦1582年10 月15日(金) • また、史実として欧州全体で一斉に切り替わったわけではない 点に注意 • 現在でもユリウス暦を使い続けている教会などもある •
コンピュータ上では1582年10月4日の翌日が1582年10月15日と なる実装がしばしば見られる
java.util.GregorianCalendar https://docs.oracle.com/javase/jp/17/docs/api/java.base/java/util/GregorianCalendar.html • グレゴリオ暦の実装だが、 1582年10月15日より前はユリウス 暦となる • setGregorianChangeでユリウス暦ないし先発グレゴリオ暦と して動かすこともできる
太陽太陰暦 • 地球が太陽の周りを回る周期と、月が地球の周りを回る周期の 両方を基にする • つまり、複雑 • 日本の古代の暦は中国の暦法の輸入 • 月の満ち欠けの周期は平均して約29.53日
• 1か月を30日の大の月と、29日の小の月をおいて調整する • 1日は新月の日で朔(さく)とも呼ばれる • 15日あたりが満月になるが、実際にはもっと複雑
閏月 • 1年を24等分したものが二十四節気 • うち、半分が節気、半分が中気と呼ばれる • 中気の「雨水」を含む月を一月といった風に月を定める • 基本的には中気を含まない月を閏月とする
UNDECIMBER • java.util.Calendar には 13番目の月をあらわすUNDECIMBER フィールドが宣言されている • 和暦の太陽太陰暦での閏月をあらわすには機能的に不足 • ユダヤ暦の閏月(アダル月)を念頭においたものか?
• ユダヤ暦では12月アダル月を2回繰り返す形で閏月を挿入
和暦クイズ • 日本で最初に用いられた元号は
和暦クイズ • 日本で最初に用いられた元号は大化ですが、二番目に用いられ た元号は
和暦クイズ • 日本で最初に用いられた元号は大化ですが、二番目に用いられ た元号は白雉( はくち、びゃくち、しらきぎす )です。 • いずれの元号も孝徳天皇によるものですが、白雉5年に孝徳天 皇が崩御すると姉の斉明天皇(さいめいてんのう)が次代の天 皇となります。
• 白雉5年の翌年は何元年と呼ばれたでしょうか?
和暦クイズの正解 斉明天皇元年
紀年法 • 年の表し方のこと • 日本では元号の利用以前は即位紀元が用いら れていた • 《改天豊財重日足姫天皇四年、為大化元年》 • 天豊財重日足姫天皇(あめとよたからいかし
ひたらしひめのすめらみこと)とは皇極(こ うぎょく)天皇の和風諡号(しごう) 日本書紀 巻第二十五
元号の停止と再開 • 大化(645年~650年) • 白雉(650年~655年) • 斉明(さいめい)天皇(655年~661年) • 天智(てんぢ)天皇(662年~672年) •
天武(てんむ)天皇(673年~686年) • 朱鳥(しゅちょう、すちょう、あかみとり)(686年~687年) • 持統(じとう)天皇(687年~697年) • 文武(もんむ)天皇(697年~701年) • 大宝(たいほう)(701年~704年)元年に大宝律令が完成 太字は元号。元号停止期間中は即位紀元が用いられていた
古代の和暦の紀年法をどうするか • 元号のみとすると「大宝」以前に元号停止期間があるので問題 が生じる • 大宝以降のみを扱う案 • 即位紀元を併用する案 • 即位紀元を併用すれば停止期間を含めて表現可能
• しかし最初の元号「大化」より以前の時代にすでに即位紀元が用いら れている • どこまで遡って対応するのか • 干支による年の表現をどうするか問題
干支による年の表現 • 中国や日本では古代より干支によって年をあらわすことがされ てきた • 十干(甲・乙・丙・丁・戊・己・庚・辛・壬・癸) • 十二支(子・丑・寅・卯・辰・巳・午・未・申・酉・戌・亥) • これを組み合わせるが、甲子→乙丑→丙寅…とするため偶奇が
組み合わさることがなく60通りとなる • 年をmod60したようなものと言える • 2023年は癸卯(みずのとう)で干支では40番目となる
干支による日の表現 • 年とは独立に、日も干支で順に数える習慣がある • 2023年1月21日は干支の16番目、己卯(つちのと う) • 前日の金曜は15番目の戊寅(つちのえとら) • 明日の日曜は17番目の庚辰(かのえたつ)
• 神武天皇の即位日は《辛酉年春正月 庚辰朔》 • 辛酉年の正月の朔日(1日)が庚辰であるの意味 • 「癸卯年己卯、行鰤会議」といった記述で年月が分 かる仕組みとなっている • 使われている以上は算出したい
四文字の元号 • 四文字年号時代(749年 - 770年) • 四文字の元号はこの5種でかつ連続して用いられた • 元号欄の表示幅は2文字ではダメ
即位紀元 • 初期の元号利用の間にある即位紀元の表記方法をどうするか • (斉明)といった表記がされている例がある • 古代を扱うなら四文字元号もあるためいずれにせよ表示欄は漢 字二文字では足りない。「斉明天皇」といった表記でも良いか もしれない •
古代の天皇は複数の名前があることがあるのでどの表記を用い るかも考えどころではある
3桁の年号 古代の天皇はやたら長生き 1. 景行天皇(第12代): 143歳 2. 仁徳天皇(第16代): 143歳 3. 垂仁天皇(第11代):
139歳 4. 孝安天皇(第6代): 137歳 5. 孝霊天皇(第7代): 128歳 在位年数が最長なのは孝安天皇(第6代)で102年 年号が2桁だと足りない 孝安天皇102年の正月は戊戌(つちのえいぬ) 日本書紀暦日原典より
南北朝時代 南北朝時代には、持明院統(北朝)、 大覚寺統(南朝)が独自に元号を制定 したため、元徳3年/元弘元年(1331 年)から元中9年/明徳3年(1392年) まで2つの元号が並存した • 現代では宮内庁を始め天皇の代数は 南朝で数えるのが主流 •
西暦の年と和暦の年は1対多関係
元嘉暦 • 日本最古の暦法 • 『宋書十三 志第三』 (沈約 487~502 年ごろ?) に記載
• 元嘉暦は比較的原始的な暦でメトン周 期19太陽年 = 235朔望月 に基づく • 《章歳十九》《章月二百三十五》 • アルゴリズムの一次資料に当たりたけ れば漢文を読む必要がある 宋書十三 志第三
元嘉暦 • 元嘉暦とより新しい儀鳳暦とが併用して用いられた • 《奉勅始行元嘉暦與儀鳳暦》 • 中国では南朝の宋・斉・梁の諸王朝で、元嘉22年(445 年)から天監8年(509年)までの65年間用いられた。 • 百済では、宋における採用と同時に伝えられ、その滅亡
の661年まで行用 • 日本での暦の正式の採用は持統天皇6年(西暦692年) ※持 統天皇4年説も 日本書紀 巻30
平朔法 • 元嘉暦は原始的な暦法で、月 の満ち欠けの周期、朔望月を 単純に 22207/752 ≒ 29.53 日と置いている •
実際には平均29.53日で満ち 欠けするが29.3~29.8日と幅 がある • 平朔法ではこれを考慮しない
平気法 • 二十四節気も単純に1年を24等分している • 元嘉暦では1太陽年 = 222070 / 608 ≒
365.2467日 • 実際には地球から見た太陽の動きは一定で はなく、冬に早く、夏は遅い • 地球の公転の楕円軌道の関係。近日点は1月 あたり
元嘉暦の計算の概要 • 月の朔日を求める • 二十四節気を求める • 中気を含む月を割り当てる • 中気を含まない月を閏月とする
元嘉暦の計算の概要 《上元庚辰甲子紀首 … 至元嘉二十年癸未五千七百三年》 元嘉二十年(西暦443)が上元(基準となるゼロ点)から5703年で ある。これを西暦0年からの値に直すと5260年 日本暦日原典の解説によれば西暦x年の正月朔は 1) (5260+x) ×
235/19 = A …… 余り 2) A×22207/752 = B …… 余りが朔の小余 3) B÷60=C …… 余りが朔の大余
元嘉暦の計算の概要 • メトン周期 19太陽年 = 235朔望月 に基づく • 1太陽年あたりの朔望月は 235/19
• 1) で原点である上元からの年数にこれを掛ける • その端数が元旦での月の位置を表す • 1朔望月 = 22207/752 ≒ 29.53 日としている • 2)でこれを掛け、商が正月朔の日、余りが正月朔の時間となる • 3)で60で割って干支を求めている
元嘉暦の計算の概要 日本暦日原典の解説によれば正月中は 1)' (5260+x)×222070/608=A' …… 余りが中気の小余 2)' A'÷60=B' …… 余りが中気の大余
• 元嘉暦では1太陽年 = 222070 / 608 ≒ 365.2467日
儀鳳暦 • 元嘉暦とともに日本最古の暦法 • 持統天皇6年(西暦692年)より元嘉暦と儀鳳暦とが併用 • 《奉勅始行元嘉暦與儀鳳暦》 • 後に元嘉暦が廃され儀鳳暦が単独で用いられる •
中国では唐の麟徳二年(665)~開元十六年(728)の64年間 • 元嘉暦が445年の暦であることを鑑みると当時最新の暦 • 定朔法(月の満ち欠けの周期を考慮) • 破章法(メトン周期よりも精度を高める)
儀鳳暦の定気法 • 儀鳳暦では1年を489428 / 1340 ≒ 365.2447 としている • これを24で割って太陽表の躔差率を
加えて補正する • 日本ではこの補正を略して平気法で 計算を行っていたようだ 儀鳳暦の太陽表 日本暦日原典より
儀鳳暦の定朔法 • 月の満ち欠けの周期を表の値を用いて 補正する • 日本での計算は簡素化した方法であっ ただろうとされている
日本書紀暦日原典 • 日本書紀の暦日は5世紀なかばまでは儀鳳暦(但 し平朔法)以後は元嘉暦によるものであること が知られる。 • 日本書紀の暦日に就て 小川清彦(昭和21年) • 日本書紀暦日原典(内田正男
昭和53年)は日本書 紀に出てくる約900の朔干支を、コンピュータ で算出した暦と照らし合わせて異同を参照でき るようにした本 • 紀元前666年~紀元後697年まで
日本書紀の暦 • 5世紀なかばまでは儀鳳暦 • 以後は元嘉暦 • 古い時代に新しい暦が用いら れている? • 日本では皇紀元年に中国より
1300年進んだ暦を独自に開発 して使っていたんだ!🤥 • 紀元前433年のアテナイの数学 者・メトンより早く(以下略
和暦ライブラリ • そんなあれこれに対応できる和暦の ライブラリを細々と書いています • Araragi (仮称) • グレゴリオ暦の実装 –
済 • ユリウス暦の実装 – 済 • 元嘉暦の実装 – 済 • 儀鳳暦の実装 – 仕掛中 • その他7暦法対応予定