西暦から元号と干支を生成する
いままで知らなかったが、JavaScriptのDate.toLocaleDateStringメソッドを使い、西暦をもとに、「大化」から始まる公年号(元号)を簡単に生成できる。
var date = new Date(645, 6, 1);
var option = {era:"short", year:"numeric"};
var str=date.toLocaleDateString("ja-JP-u-ca-japanese", option);
console.log(str); // 大化1年
大化は、6月19日から。それ以前の年は、すべて大化から遡る。たとえば、西暦344年は、「大化 -300年」が返される。
また、655年から685年、691年から700年の間は元号が建てられていないとされるが、それには対応していない。西暦661年は、前の「白雉」を引き継いで、実際には存在しないとされる白雉11年と生成される。
なお、現時点(2019年5月)のChromeでは、「令和」には対応していない。
日付について。それは理解を超える。
前項では、日付は表示していないが、もちろん表示できる。
var date = new Date(1222, 3, 19);
var option = {era:"short"};
var str=date.toLocaleDateString("ja-JP-u-ca-japanese", option);
console.log(str); // 承久4年4月12日
承久は4月12日までなので、翌日の、new Date(1222, 3, 20) を渡すと、正しく、貞応1年4月13日 と生成される。
ただ、new Dateで生成している日付と、7日ずれている理由がよくわからない。
西暦1400年から前かと思うが、なぜか7日前後(常に7日ではない)ずれるのである。ずれかたからして暦法のからみではなさそうだ。閏だろうか。わたしの理解を超える。
干支の生成
干支の生成は、おそらくJSには実装されていないと思うが、生成はとても単純だ。
十干(じっかん)と、十二支の配列データを用意しておき、西暦を、それぞれ10と12を割った余りの値で導かれる。
const e = ["庚", "辛", "壬", "癸", "甲", "乙", "丙", "丁", "戊", "己"];
const to = ["申", "酉", "戌", "亥", "子", "丑", "寅", "卯", "辰", "巳", "午", "未"];
let year = 1868;
console.log(e[(year%10)], to[(year%12)]);//戊 辰
おまけ
wikipedia「干支」のページから抽出した干支の音訓読み、中国、韓国、ベトナム語読み、意味をデータにまとめた。
const e10 = [
{kan: "庚" , ohn: "こう" , kun: "かのえ" , han: "gēng" , kor: "경 (gyeong)" , vet: "canh" , mean: "結実、形成、陰化の段階" },
{kan: "辛" , ohn: "しん" , kun: "かのと" , han: "xīn" , kor: "신 (shin)" , vet: "tân" , mean: "陰による統制の強化" },
{kan: "壬" , ohn: "じん" , kun: "みずのえ" , han: "rén" , kor: "임 (im)" , vet: "nhâm" , mean: "“妊”に通じ、陽気を下に姙む意" },
{kan: "癸" , ohn: "き" , kun: "みずのと" , han: "guǐ" , kor: "계 (gye)" , vet: "quý" , mean: "“揆”に同じく生命のない残物を清算して地ならしを行い、新たな生長を行う待機の状態" },
{kan: "甲" , ohn: "こう" , kun: "きのえ" , han: "jiǎ" , kor: "갑 (gap)" , vet: "giáp" , mean: "草木の芽生え、鱗芽のかいわれの象意" },
{kan: "乙" , ohn: "おつ、いつ" , kun: "きのと" , han: "yǐ" , kor: "을 (eul)" , vet: "ất" , mean: "陽気のまだ伸びない、かがまっているところ" },
{kan: "丙" , ohn: "へい" , kun: "ひのえ" , han: "bǐng" , kor: "병 (byeong)" , vet: "bính" , mean: "陽気の発揚" },
{kan: "丁" , ohn: "てい" , kun: "ひのと" , han: "dīng" , kor: "정 (jeong)" , vet: "đinh" , mean: "陽気の充溢" },
{kan: "戊" , ohn: "ぼ" , kun: "つちのえ" , han: "wù" , kor: "무 (mu)" , vet: "mậu" , mean: "“茂”に通じ、陽気による分化繁栄" },
{kan: "己" , ohn: "き" , kun: "つちのと" , han: "jǐ" , kor: "기 (gi)" , vet: "kỷ" , mean: "“紀”に通じ、分散を防ぐ統制作用" },
];
const to12 = [
{kan: "申" , ohn: "しん" , kun: "さる" , han: "shēn" , kor: "신 (shin)" , vet: "thân" , mean: "陰気の支配" },
{kan: "酉" , ohn: "ゆう" , kun: "とり" , han: "yǒu" , kor: "유 (yu)" , vet: "dậu" , mean: "酒熟して気の漏れる象。陰気の熟する所" },
{kan: "戌" , ohn: "じゅつ" , kun: "いぬ" , han: "xū" , kor: "술 (sul)" , vet: "tuất" , mean: "同音“恤”であり、“滅”である。統一退蔵。" },
{kan: "亥" , ohn: "がい" , kun: "い" , han: "hài" , kor: "해 (hae)" , vet: "hợi" , mean: "“核”で、生命の完全な収蔵含蓄" },
{kan: "子" , ohn: "し" , kun: "ね" , han: "zǐ" , kor: "자 (ja)" , vet: "tý" , mean: "“孳”で、陽気が色々に発現しようとする動き" },
{kan: "丑" , ohn: "ちゅう" , kun: "うし" , han: "chǒu" , kor: "축 (chuk)" , vet: "sửu" , mean: "“紐”で、生命エネルギーの様々な結合" },
{kan: "寅" , ohn: "いん" , kun: "とら" , han: "yín" , kor: "인 (in)" , vet: "dần" , mean: "“演”で、形をとっての発生" },
{kan: "卯" , ohn: "ぼう" , kun: "う" , han: "mǎo" , kor: "묘 (myo)" , vet: "mão/mẹo" , mean: "同音“冒”に通じ、開発の意" },
{kan: "辰" , ohn: "しん" , kun: "たつ" , han: "chén" , kor: "진 (jin)" , vet: "thìn" , mean: "“震”、同音“申”に同じ、生の活動" },
{kan: "巳" , ohn: "し" , kun: "み" , han: "sì" , kor: "사 (sa)" , vet: "tỵ" , mean: "“已”に通じ、陽盛の極、漸く陰に移ろうとする所" },
{kan: "午" , ohn: "ご" , kun: "うま" , han: "wǔ" , kor: "오 (o)" , vet: "ngọ" , mean: "“忤(さからう)”に通じ、上昇する陰と下退する陽との抵触" },
{kan: "未" , ohn: "び" , kun: "ひつじ" , han: "wèi" , kor: "미 (mi)" , vet: "mùi" , mean: "“昧”で、陰気の支配" },
];
参考 wikipedia「元号」、同「干支」、「元号-年号から読み解く日本史」文藝春秋