▶ 実 行
▶ 実行
クリア
旧暦変換プラグイン
by 雪乃☆雫
# 【旧暦変換プラグイン】 Qreki.nako3 v1.1.2 #和暦データ取得 定数 和暦データ=「https://n3s.nadesi.com/image.php?f=199.json 」からAJAX_JSON取得。 定数 元号一覧=和暦データ["元号一覧"]。 定数 旧暦表=和暦データ["旧暦表"]。 #歴註データ取得 定数 歴註データ=「https://n3s.nadesi.com/image.php?f=200.json」からAJAX_JSON取得。 定数 七十二候データ=歴註データ["七十二候"]。 定数 二十四節気データ=歴註データ["二十四節気"]。 定数 十干データ=歴註データ["十干"]。 定数 十二支データ=歴註データ["十二支"]。 #定数 定数 グレゴリオ暦開始=「1582/10/15」の修正ユリウス日取得G。 定数 太陽暦採用=「1873/01/01」を修正ユリウス日取得G。//明治六年 定数 元号未制定時期=「701/05/02」の修正ユリウス日取得J。# 大宝元年以前 定数 元号並立期間始め=「1331/09/11」の修正ユリウス日取得J。# 南北朝時代 定数 元号並立期間終り=「1394/08/01」の修正ユリウス日取得J。 定数 元号並立期間=[元号並立期間始め,元号並立期間終わり]。 定数 旧暦表始め=旧暦表[0]["元日"]の修正ユリウス日取得J。 定数 旧暦表終り=(旧暦表[(旧暦表の要素数)-1]["元日"]の修正ユリウス日取得G)-1。 #---西暦を旧暦に変換する-------------------- # 西暦→旧暦 //大化元年1月1日(645/2/2)から2099/12/31までの西暦の日付を旧暦に変換。 ●(西暦を|西暦の)西暦旧暦変換 変数 旧暦=西暦から旧暦取得。 旧暦を「/」で区切る。 変数 [年,月,日]=それ。 年を「・」で区切る。年=それ。 もし、(年の配列要素数)>1ならば、 「{年[0]}年/{年[1]}年{月}月{日}日」で戻る。 違えば、 「{年}年{月}月{日}日」で戻る。 ここまで。 ここまで。 # 西暦→和暦 //大化元年1月1日(645/2/2)から明治5年12月2日(1872/12/31)までの西暦の日付を旧暦に変換。 //明治六年1月1日(1873/1/1)以降の場合は、現行のグレゴリオ暦に西暦年を元号年に変換っていうかなでしこの和暦変換。 //(なでしこの和暦変換は一桁の月、日がゼロ埋めされますが、しないようにしています。) ●(西暦を|西暦の)西暦和暦変換 西暦は西暦を英数半角変換して、「/」を「/」に置換。 もし、太陽暦採用≦(西暦の修正ユリウス日取得)ならば、 西暦を和暦変換して、それを「[年月日]」で正規表現区切る。 変数 [年,月,日]=それ。 「{年}年{月を整数変換}月{日を整数変換}日」で戻る。 違えば、 西暦を西暦旧暦変換して戻る。 ここまで。 ここまで。 # 旧暦取得 //大化元年1月1日(645/2/2)から2099/12/31までの西暦から旧暦を取得。(v1同様「元号yy/mm/dd」表記) //文献データを元に暦日を取得するもので、天文学的な計算によって算出するなでしこv1の旧暦変換とは結果が異なる場合があります(特に閏月の設定) //また西暦は、1582/10/04までユリウス暦、1582/10/15からグレゴリオ暦としています(v1では、1582/10/15以前も遡りでグレゴリオ暦を適用されているので結果がずれます) ●(西暦から|西暦の)旧暦取得 #西暦をチェックして修正ユリウス日に変換。 西暦は西暦を英数半角変換して、「/」を「/」に置換。 西暦を『\d{3,4}/\d{1,2}/\d{1,2}』で正規表現マッチ。 もし、それがNULLならば、「【日付が不正です】」で戻る。 変数 対象日=西暦の修正ユリウス日取得。 もし、(旧暦表始め>対象日)または(旧暦表終わり<対象日)ならば、「【日付が有効範囲外です】」で戻る。 対象日=西暦の修正ユリウス日取得。 変数 年=西暦から「旧暦」で元号取得。 もし、(年の配列要素数)>1ならば、年=年を「・」で配列結合。//半角中点 #旧暦Noから対象データを設定 変数 旧暦No=西暦の旧暦番号検索。 対象データ=旧暦表[旧暦No]。 変数 元日=対象データ["元日"]の修正ユリウス日取得。 変数 翌年=旧暦表[対象キー+1]["元日"]の修正ユリウス日取得。 変数 閏=対象データ["閏"]。変数 月大小=対象データ["大小"]。 変数 日数=対象日-元日。 #元日からの日数から各月の日数を引いていき、何月何日か求める。 変数 [大小,月,日]=空。 月大小の要素数回 #各月の日数は、大の月1、小の月0でテーブルにしているので、それを29に足しているだけ。 大小=月大小[回数-1]。 もし、(29+大小)≦日数ならば、 日数=日数-(29+大小)。 違えば、 日=日数+1。 #閏月があれば月数を調整 もし、回数>閏ならば、 月=回数-1。 もし、月=閏ならば、 月=閏+0.5。 ここまで。 違えば、 月=回数。 ここまで。 もし、(月>閏)かつ(月<閏+1)ならば、月=「閏{閏}」 「{年}/{月}/{日}」で戻る。 ここまで。 ここまで。 「不明」で戻る。 ここまで。 #---和暦を西暦に変換する-------------------- # 和暦→西暦 //和暦を西暦に変換。明治六年以降は現行のグレゴリオ暦により、元号年を西暦年に変換しているだけ。 //それ以前の和暦は、旧暦の日付として、西暦の日付に変換。天皇の年紀には非対応。 //西暦は、1582/10/04までユリウス暦、1582/10/15からグレゴリオ暦。 ●(和暦を|和暦の)和暦西暦変換 #和暦を年月日に分解 和暦は、和暦を英数半角変換して、「/」を「/」に置換。 和暦は、和暦を「/」で区切る。 もし、(和暦の配列要素数)≦1ならば、和暦は和暦を「[年月日]」で正規表現区切る。 変数 [元号年,月,日]=和暦。 #日付のチェック(大の月か小の月かはあとでチェックする) もし、(月>12)または(日>31)ならば、「【日付が不正です】」で戻る。 #閏月かどうか(実際のチェックはあとでする) もし、(月の1だけ文字左部分)=「閏」ならば、 月=月の「閏」を空に置換。閏=はい。 ここまで。 #漢字表記を算用数字に(元年、正月、朔日の表記に対応) もし、月=「正」ならば、月=「1」。 もし、(月を数列か判定)=いいえならば、月=月を算用数字。 もし、閏=はいならば、月=月+0.5。 もし、日=「朔」ならば、日=「1」。 もし、(日を数列か判定)=いいえならば、日=日を算用数字。 もし、(元号年の1だけ文字右部分)=「元」ならば、 元号年=元号年の(元号年の文字数)から1だけ文字削除。 元号年=元号年に「1」を追加。 ここまで。 #元号年からその年の正月を取得する。 元号年から西暦範囲取得。変数 元日はそれ[0]。 もし、太陽暦採用≦(元日の修正ユリウス日取得)ならば、 #明治六年(グレゴリオ暦採用)以降の場合。 元日を「/」で区切る。変数 年=それ[0]。「{年}/{月}/{日}」で戻る。 違えば、 #旧暦Noから対象データを設定 変数 旧暦No=元日の旧暦番号検索。 変数 対象データ=旧暦表[旧暦No]。 変数 閏月=対象データ["閏"]。変数 月大小=対象データ["大小"]。 元日は元日の修正ユリウス日取得。 #閏月のチェック もし、(閏=はい)かつ(閏月≠(月を切り捨て))ならば、「【{元号年}年に閏{月を切り捨て}月はありません】」で戻る。 もし、閏月<月ならば、月=月+1を切捨て。 #日付チェック もし、日>30ならば、「【日付が不正です】」で戻る。#大の月30日 もし、(日≧30)かつ(月大小[月-1]=0)ならば、「【{元号年}年{月-1}月は小の月です】」で戻る。 #ループで月の日数を足していき、最後に日にちを足して、元旦の日付からの日数を数える。 変数 日数は0。 (月-1)回 日数=日数+29+月大小[回数-1]。 ここまで。 日数=日数+日-1。日付=元日+日数。 もし、日付≧グレゴリオ暦開始ならば、日付からグレゴリオ暦取得して戻る。 違えば、日付からユリウス暦取得して戻る。 ここまで。 ここまで。 # 大化元年以降の元号年から、その年の元日と大晦日を西暦の日付にして[元日,大晦日]の配列で返す。 /* ・大化元年以降の元号年から、その年の元日と大晦日を西暦の日付にして[元日,大晦日]の配列で返す。 ・元年も改元日は考慮せず、その年の元日から表示させています(慶応四年と明治元年は同じになる) ・元号の終了年については考慮していません(ので、昭和96年=2021年みたいな計算も可能です) ・和暦は、明治五年までは旧暦、明治六年からは西暦と同じ。ただし、旧暦fに「旧暦」を指定した場合は、全て旧暦で取得。 ・西暦は、1582/10/04までユリウス暦、1582/10/15からグレゴリオ暦。 ・元号未制定期間の天皇の年紀については対応していません。 */ ●(旧暦fで元号年から|元号年の)西暦範囲取得 #元年に対応 元号年=元号年の「年」を空に置換して、それを英数半角変換。 もし、(元号年の1だけ文字右部分)=「元」ならば、 元号年=元号年の(元号年の文字数)から1だけ文字削除。 元号年=元号年に「1」を追加。 ここまで。 #元号と年を分離し、漢数字は算用数字に変換。 変数 年=元号年を「/\d+|[一二三四五六七八九十]+/」で正規表現マッチ。 変数 元号=元号年の年を空に置換。 もし、年=「元」ならば、年=1。 もし、(年を数列か判定)=いいえならば、年=年を算用数字。 #元号一覧から元号を検索して、改元日(開始日)を求める。 変数 [元号No,改元日,元日,大晦日]=空。 元号一覧を反復 もし、(元号=対象["元号"])または(元号=対象["略号"])ならば、 元号No=対象キー。 #明治6より後の場合 もし、(旧暦f≠「旧暦」)かつ((元号No≦3)または((元号No=4)かつ(年≧6)))ならば、 対象["西暦"]を「/」で区切る。年=年+それ[0]-1。 ["{年}/1/1","{年}/12/31"]で戻る。 ここまで。 改元日=対象["西暦"]。 旧暦No=(改元日の旧暦番号検索)+年-1。 元日=旧暦表[旧暦No]["元日"]。 大晦日=(旧暦表[旧暦No+1]["元日"]の修正ユリウス日取得)-1。 もし、大晦日≧グレゴリオ暦開始ならば、 大晦日=大晦日からグレゴリオ暦取得。 違えば、 大晦日=大晦日からユリウス暦取得。 ここまで。 [元日,大晦日]で戻る。 ここまで。 ここまで。 ここまで。 #---日単位で元号年を取得する-------------------- # 本気の元号取得 /* ・大化元年(645/2/2)以降の西暦の日付から、改元日を元に日単位で元号を返す。 ・一応年だけ指定することもできます。その場合は、その年の12/31で取得した元号を返す。(1/1だともれなく元年が出なくなるため) ※ 1872年以前の和暦は旧暦なので、和暦と西暦の年が完全には一致しません。 ・1873~2099までの旧暦にも対応。 旧暦fに「旧暦」を指定すると、太陽暦採用(1873/1/1)以降でも、旧暦としての元号を返す。 (省略や「旧暦」以外の場合は、普通にグレゴリオ暦としての元号を返す) ※引数を省略するとエラーになるようになってしまったため、旧暦fを第一引数に。 万一不用意に「それ」が「旧暦」になってた場合でも、太陽暦採用(1873/1/1)以降でも、旧暦としての元号になっちゃいますが仕様ですw ・南北朝時代の元号並立期間は[南朝,北朝]の配列で返す。 ・元号未制定期間は天皇の年期を代用。そのため、「大化」「白雉」「朱鳥」の開始終了は、例外的に改元日と異なる。 ・「文中」は正確な改元日が不明(4/?)のため仮に4/1として運用。 ・「明治」は立年改元で布告されているため旧1/1から明治元年とする説もあるが「なでしこ3」の和暦変換に合わせ改元日を採用。 ・「平成」は、1989/1/8改元で、新暦では年が明けていますが旧暦では年が明ける前の改元ですが、例外的に年が明けるまでは昭和63年とする。 (旧暦しか無かった時のルールでは、平成元年が19日しか無いことになってしまい、新暦の和暦と元号が合わなくなるため) */ ●(旧暦fで西暦から)元号取得 #西暦をチェックして修正ユリウス日に変換。 西暦は西暦を英数半角変換して、「/」を「/」に置換。 西暦を「/」で区切る。変数 年=それ[0]。 もし、(それの要素数)<3ならば、西暦=「{年}/12/31」。 西暦を『\d{3,4}/\d{1,2}/\d{1,2}』で正規表現マッチ。 もし、それがNULLならば、「【日付が不正です】」で戻る。 変数 対象日=西暦の修正ユリウス日取得。 もし、旧暦表始め>対象日ならば、「【日付が有効範囲外です】」で戻る。 変数 南北朝時代=いいえ。変数 [南朝元号年,北朝元号年]=空。 #改元日では処理できない例外期間の元号の開始日。 初日とは変数。 もし、対象日≦元号未制定時期ならば、初日=「開始」。 違えば、もし、(元号並立期間[0]≦対象日)かつ(対象日≦元号並立期間[1])ならば、初日=「開始」。 違えば、初日=「西暦」。#西暦改元日 #データの開始終了も修正ユリウス日に変換して、その範囲に指定した西暦が該当するか調べる。 変数 [元号,元号No,開始日,改元日,南北]=空。 元号一覧を反復 元号=対象["元号"]。元号No=対象キー。開始日=空。 もし、対象[初日]=未定義ならば、続ける。#元号の開始日に指定した項目が空なら明らかに対象外の元号。 開始日=対象[初日]を修正ユリウス日取得。 もし、開始日≦対象日ならば、 もし、元号No=0ならば、対象["西暦"]から元号Noと旧暦fで西暦の和暦年数取得して、元号&それで戻る。 違えば、もし、(元号並立期間[0]≦対象日)かつ(対象日≦元号並立期間[1])ならば、終了=対象["終了"]を修正ユリウス日取得。 違えば、終了=元号一覧[元号No-1][初日]を修正ユリウス日取得。 もし、対象日≦終了ならば #例外期間の処理 もし、(元号並立期間[0]≦対象日)かつ(対象日≦元号並立期間[1])ならば、 改元日=対象["西暦"]。南北=対象["南北朝"]。 違えば、 改元日=対象[初日]。南北=空。 ここまで。 #既に南北朝時代のフラグが立っていた場合南北の元号を配列にして戻す。 もし、南北朝時代=はいならば、 改元日から元号Noと旧暦fで西暦の和暦年数取得。 南朝元号年=元号&それ。 [南朝元号年,北朝元号年]で戻る。 #元号並立期間内ならフラグを立てて続ける。 違えば、もし、(元号並立期間[0]≦対象日)かつ(対象日≦元号並立期間[1])ならば、 改元日から元号Noと旧暦fで西暦の和暦年数取得。 もし、南北=「南北」ならば、元号&それで戻る。 北朝元号年=元号&それ。 南北朝時代=はい。続ける。 #南北朝時代で無ければ普通に元号を返す。 違えば、 改元日から元号Noと旧暦fで西暦の和暦年数取得。 もし、(元号=「平成」)かつ(それ=0)ならば、「昭和63」で戻る。#平成の例外処理 違えば、元号&それで戻る。 ここまで。 ここまで。 ここまで。 ここまで。 「不明」で戻る。 ここまで。 ##改元日からの年数を数える(元号取得の下請け) /* グレゴリオ暦であれば、和暦年の年数は「西暦年-改元日+1」で計算できる。 旧暦の場合は、旧暦の元日がいつかを調べる必要がある(それ以前は前年) */ ●(元号Noと改元日から旧暦fで日付の)和暦年数取得 改元日を「/」で区切る。変数 改元年=それ[0]。 日付を「/」で区切る。変数 年=それ[0]。 変数 対象日=日付の修正ユリウス日取得。 変数 [年数,元年,旧暦No]=空。 もし、(対象日≧太陽暦採用)かつ(旧暦f≠「旧暦」)ならば、#太陽暦採用後(グレゴリオ暦) 年数=年-改元年+1。 もし、年数=1ならば、「元」で戻る。 違えば、年数で戻る。 違えば、 改元日で旧暦番号検索。元年=それ。 日付で旧暦番号検索。旧暦No=それ。 もし、元号一覧[元号No]@"元号"=「平成」ならば、元年=元年+1。#平成の例外処理 年数=旧暦No-元年+1。 もし、年数=1ならば、「元」で戻る。 違えば、年数で戻る。 ここまで。 ここまで。 #---旧暦表から目的の年を検索して番号を得る-------------------- # 色々な命令の下請け ●(西暦の|西暦で)旧暦番号検索 西暦は西暦を英数半角変換して、「/」を「/」に置換。 西暦を「/」で区切る。対象年=それ[0]。 旧暦表[0]@"元日"を「/」で区切る。検索開始年とは変数=それ[0]。 旧暦Noとは変数=対象年-検索開始年。 #元日より前なら前年。 西暦=西暦の修正ユリウス日取得。 元日とは変数=旧暦表[旧暦No]@"元日"の修正ユリウス日取得。 もし、西暦<元日ならば、旧暦No=旧暦No-1。 旧暦Noで戻る。 ここまで。 #---西暦と修正ユリウス日とを相互変換する-------------------- # 修正ユリウス日→西暦 ※1582/10/15以降はグレゴリオ暦、それ以前はユリウス暦として修正ユリウス日を西暦に変換する。 ●(MJDを|MJDの|MJDで)MJD西暦変換 もし、MJD≧グレゴリオ暦開始ならば、MJDからグレゴリオ暦取得で戻る。 MJDからユリウス暦取得で戻る。 ここまで。 # 西暦→修正ユリウス日 ※1582/10/15以降はグレゴリオ暦、それ以前はユリウス暦として西暦を修正ユリウス日に変換する。(修正ユリウス日取得) ●(西暦を|西暦の|西暦で)西暦MJD変換 西暦の修正ユリウス日取得。 ここまで。 # 1582/10/15以降はグレゴリオ暦、それ以前はユリウス暦として修正ユリウス日を取得する。(v1非互換) ※1582/10/5~1582/10/14が指定された場合は、ユリウス暦の計算式使う。(グレゴリオ歴で1582/10/15~1582/10/24と同じになる) ※BCの場合は年にマイナスを付ける(「-1/1/1」など)。ADもBCも0年は存在しない(AD1年の前年はBC1年)ので注意。 ●(日付を|日付の|日付で|日付から)修正ユリウス日取得 日付は日付を英数半角変換して、「/」を「/」に置換。 日付を「/」で区切る。変数 y=それ[0]。 もし、y=0ならば、空で戻る。 変数 グレゴリオ暦=いいえ。 もし、グレゴリオ暦開始≦(日付の修正ユリウス日取得G)ならば、グレゴリオ暦=はい。 もし、グレゴリオ暦=はいならば、 日付の修正ユリウス日取得Gで戻る。 違えば、もし、グレゴリオ暦=いいえならば、 日付の修正ユリウス日取得Jで戻る。 違えば、 空で戻る。 ここまで。 ここまで。 # 西暦を全てグレゴリオ暦として修正ユリウス日を取得する。(v1の「修正ユリウス日取得」相当) ●(日付を|日付の|日付で|日付から)修正ユリウス日取得G 日付は日付を英数半角変換して、「/」を「/」に置換。 日付を「/」で区切る。 変数 [y,m,d]=それ。 もし、y=0ならば、空で戻る。 もし、y<0ならば、y=y+1。 もし、m≦2ならば、 y=y-1。m=m+12。 ここまで。 (FLOOR(365.25*y))+FLOOR(y/400)-FLOOR(y/100)+FLOOR(30.59*(m-2))+d-678912で戻る。 ここまで。 # 西暦を全てユリウス暦として修正ユリウス日を取得する。 ●(日付を|日付の|日付で|日付から)修正ユリウス日取得J 日付は日付を英数半角変換して、「/」を「/」に置換。 日付を「/」で区切る。 変数 [y,m,d]=それ。 もし、y=0ならば、空で戻る。 もし、y<0ならば、y=y+1。 もし、m≦2ならば、 y=y-1。m=m+12。 ここまで。 (FLOOR(365.25*y))+FLOOR(30.59*(m-2))+d-678914で戻る。 ここまで。 # 修正ユリウス日→グレゴリオ暦 ●(MJDの|MJDで|MJDから)グレゴリオ暦取得 変数 n=MJD+678881。 変数 a=4*n+3+4*FLOOR(3/4*FLOOR((4*(n+1)/146097+1)))。 変数 b=5*FLOOR((aと1461の剰余)/4)+2。 変数 y=FLOOR(a/1461)。変数 m=FLOOR(b/153)+3。変数 d=FLOOR((bと153の剰余)/5)+1。 もし、m>12ならば、 y=y+1。m=m-12。 ここまで。 もし、y≦0ならば、y=y-1。 「{y}/{m}/{d}」で戻る。 ここまで。 # 修正ユリウス日→ユリウス暦 ●(MJDの|MJDで|MJDから)ユリウス暦取得 変数 n=MJD+678883。 変数 a=4*n+3。 変数 b=5*FLOOR((aと1461の剰余)/4)+2。 変数 y=FLOOR(a/1461)。変数 m=FLOOR(b/153)+3。変数 d=FLOOR((bと153の剰余)/5)+1。 もし、m>12ならば、 y=y+1。m=m-12。 ここまで。 もし、y≦0ならば、y=y-1。 「{y}/{m}/{d}」で戻る。 ここまで。 ## モジュロ? //https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Remainder ●(AとBの)剰余 ((A%B)+B)%Bで戻る。 ここまで。 #---二十四節気・七十二候を取得する-------------------- ##二十四節気 //v1互換(タブン) //日付が二十四節気に合致していたら、それで戻る。違えば空で戻る。 ●(日付を|日付で|日付の)二十四節気取得 変数 番号=日付の二十四節気番号取得。 もし、番号が空と等しければ、空で戻る。 違えば、二十四節気データ[番号]["二十四節気"]で戻る。 ここまで。 //日付が二十四節気に合致していたら、配列番号で戻る。違えば空で戻る。 //(番号で取得しておくと、仮名や説明が取出しやすい) //小寒が最初で0スタート。 ●(日付を|日付で|日付の)二十四節気番号取得 日付は日付を英数半角変換して、「/」を「/」に置換。 日付は日付を「/」で区切る。 変数 [年,月,日]=日付。月=月を整数変換。日=日を整数変換。 日付=「{年}/{月}/{日}」。 もし、月<3ならば、Y=年-1。 違えばY=年。 数とは変数。 もし、日>15ならば、数=月*2-1。 違えば、数=月*2-2 日=二十四節気データ[数]["算出データ"]["D"]と二十四節気データ[数]["算出データ"]["A"]でYの節気計算。 もし、「{年}/{月}/{日}」=日付ならば、数で戻る。 違えば、空で戻る。 ここまで。 //西暦の年yyyyの、二十四節気Sの日付を、yyyy/mm/ddで返す。 ●(年のSを|Sで)二十四節気日付取得 変数 数=Sの二十四節気No取得。 もし、数<4ならばY=年-1。 違えばY=年。 変数 月=((数/2)を切捨)+1。 変数 日=二十四節気データ[数]["算出データ"]["D"]と二十四節気データ[数]["算出データ"]["A"]でYの節気計算。 「{年}/{月}/{日}」で戻る。 ここまで。 //二十四節気の日付ではなく、範囲(節入り日から次の節入り日の前日まで)で、配列番号を返すものです(和時計用。節月の取得にも使う) //小寒が最初で0スタート。 ●(日付の)節月取得 日付は日付を英数半角変換して、「/」を「/」に置換。 日付を「/」で区切る。 変数 [年,月,日]=それ。 もし、月<3ならば、Y=年-1。 違えばY=年。 数とは変数。 もし、日>15ならば、数=月*2-1。 違えば、数=月*2-2 日=二十四節気データ[数]["算出データ"]["D"]と二十四節気データ[数]["算出データ"]["A"]でYの節気計算。 もし、(「{年}/{月}/{日}」の修正ユリウス日取得)≦(日付の修正ユリウス日取得)ならば、 数で戻る。 違えば、 (数+23)%24で戻る。 ここまで。 ここまで。 ●(日付の)二十四節気範囲番号取得 日付の節月取得。 ここまで。 ##七十二候 # 七十二候の入り日に合致していたら、七十二候で戻る。違えば空で戻る。 ※二十四節気の節入日を初候(定気法)とし、次候はその五日後、末候は十日後としています(恒気法) ●(日付の)七十二候取得 変数 番号=日付の七十二候番号取得。 もし、番号が空と等しければ、空で戻る。 違えば、七十二候データ[番号]["本朝七十二候"]で戻る。 ここまで。 # 七十二候の入り日に合致していたら、配列番号で戻る。違えば空で戻る。仮名や読み下しを取りたい場合はこちらを使う。 //24節気は現代の暦に合わせて小寒を0としたが、こちらは七十二候の順番通り立春の第一候、東風凍を解くを0としている。 ※わかりにくくてしょうが無いので、0スタートに変更しました! 本当の候番号は+1する。 ●(日付の)七十二候番号取得 変数 数=日付の二十四節気範囲番号取得。 初候日付とは変数。七十二候Noとは変数。 今年の二十四節気データ[数]["二十四節気"]を二十四節気日付取得して、初候日付に代入。 もし、(初候日付と日付の日数差)=0ならば、七十二候No=数*3-6。//「初候」 違えば、もし、(初候日付と日付の日数差)=5ならば、七十二候No=数*3-5。//「次候」 違えば、もし、(初候日付と日付の日数差)=10ならば、七十二候No=数*3-4。//「末候」 違えば、空で戻る。 もし、七十二候No<0ならば、七十二候No=72+七十二候No。 七十二候Noで戻る。 ここまで。 //西暦の年yyyyの、七十二候Sの入り日を、yyyy/mm/ddで返す。 ※七十二候Sは、七十二候データの「本朝七十二候」(全て漢字)、または「仮名」(すべてひらがな)に合致していること。 ●(年のSを|Sで)七十二候日付取得 変数 数=Sの七十二候No取得。 変数 初次末=七十二候データ[数]["初次末"]。 変数 二十四節気=七十二候データ[数]["二十四節気"]。 変数 二十四節気日付=年の二十四節気を二十四節気日付取得。 もし、初次末=「初」ならば、二十四節気日付で戻る。 違えば、もし、初次末=「次」ならば、二十四節気日付に「+0/0/5」を日付加算して戻る。 違えば、もし、初次末=「末」ならば、二十四節気日付に「+0/0/10」を日付加算して戻る。 ここまで。 ●(日付の)七十二候範囲番号取得 変数 数=日付の二十四節気範囲番号取得。 初候日付とは変数。七十二候Noとは変数。 今年の二十四節気データ[数]["二十四節気"]を二十四節気日付取得し、初候日付に代入。 もし、(初候日付と日付の日数差)<5ならば、七十二候No=数*3-6。//「初候」 違えば、もし、(初候日付と日付の日数差)≧10ならば、七十二候No=数*3-4。//「末候」 違えば、七十二候No=数*3-5。//「次候」 もし、七十二候No<0ならば、七十二候No=72+七十二候No。 七十二候Noで戻る。 ここまで。 ##略算式 //http://addinbox.sakura.ne.jp/sekki24_topic.htm //1900~2099年まで有効(100年毎の閏年でない年についての補正が無い) ●(DとAでYの)節気計算 INT(D+(A*(Y-1900))-INT((Y-1900)/4)) ここまで。 #---十干十二支を取得する(旧暦干支取得以外はおまけ)-------------------- ##旧暦での暦月 //西暦の日付から、旧暦の年始・月初切り替えで、年の干支、月の干支、日の干支を配列で返す。 ※ 太陽暦採用以前の暦は旧暦なので年や月の変わり目が異なり、歴史的なナニカを扱う場合は干支も旧暦を元に取得しないと意味ない。 //旧暦取得の出来る645/2/2~2099/12/31の間だけ。 //西暦は、1582/10/04までユリウス暦。1582/10/15からグレゴリオ暦。 ●(日付を|日付で|日付の)旧暦干支取得 日付は日付を英数半角変換して、「/」を「/」に置換。 日付を「/」で区切る。変数 [年,西暦月]=それ。 日付から旧暦取得。それを「/」で区切る。変数 月=それ[1]。 もし、(月の1だけ文字左部分)=「閏」ならば、月の1から1文字削除。#月の「閏」を省く。 もし、月-西暦月>9ならば、年=年-1。# 旧暦ではまだ年が変わっていない 日付から年と月で干支配列作成して戻る。 ここまで。 ##節切(節月) //立春・節気切り替えで、年の干支、月の干支、日の干支を配列で返す。占いとかはコレらしい。 //二十四節気取得の略算式が1900~2099年の対応なので、その範囲内だけ。 ●(日付を|日付で|日付の)節切干支取得 日付は日付を英数半角変換して、「/」を「/」に置換。 日付を「/」で区切る。変数 西暦年=それ[0]。変数 年=西暦年。 変数 元日=西暦年の「立春」を二十四節気日付取得。 もし、(元日と日付の日数差)<0ならば、年=西暦年-1。 変数 節月=日付の節月取得。 もし、節月%2=1ならば、節月=節月-1。 節月=節月/2。 もし、節月≦0ならば、節月=節月+12。 日付から年と節月で干支配列作成して戻る。 ここまで。 ##西暦での暦月 //西暦の日付で、年の干支、月の干支、日の干支を配列で返す。 //西暦は、1582/10/04までユリウス暦。1582/10/15からグレゴリオ暦。 ●(日付を|日付で|日付の)干支取得 日付は日付を英数半角変換して、「/」を「/」に置換。 日付を「/」で区切る。変数 [年,月]=それ。 日付から年と月で干支配列作成して戻る。 ここまで。 #----------------------------------------------- ##v1互換風味 ●(日付を|日付で|日付の)年ノ干支取得 日付の干支取得。 それ[0]の1だけ文字右部分。 ここまで。 ●(日付を|日付で|日付の)日ノ干支取得 日付の干支取得。 それ[2]の1だけ文字右部分。 ここまで。 #----------------------------------------------- ##[年干支,月干支,日干支]の配列にして返す(下請け) ●(日付から年と月で)干支配列作成 変数 干支=空配列。 年で年干支番号取得。 干支[0]=十干データ[それ[0]]["十干"]&十二支データ[それ[1]]["十二支"]。# 年の干支 年と月で月干支番号取得。 干支[1]=十干データ[それ[0]]["十干"]&十二支データ[それ[1]]["十二支"]。# 月の干支 日付の修正ユリウス日取得。 それで日干支番号取得。 干支[2]=十干データ[それ[0]]["十干"]&十二支データ[それ[1]]["十二支"]。# 日の干支 干支で戻る。 ここまで。 #----------------------------------------------- ##干支番号取得(主に下請け) ●(西暦年で|西暦年の)年干支番号取得 変数 十干No=(西暦年+6)と10の剰余。 変数 十二支No=(西暦年+8)と12の剰余。 [十干No,十二支No]で戻る。 ここまで。 ●(西暦年と月で|月の)月干支番号取得 変数 No=(月-1)+(西暦年-1600)*12。 変数 十干No=(No+4)と10の剰余。 変数 十二支No=(No+2)と12の剰余。 [十干No,十二支No]で戻る。 ここまで。 ●(修正ユリウス日で|修正ユリウス日の)日干支番号取得 変数 十干No=修正ユリウス日と10の剰余。 変数 十二支No=(修正ユリウス日+2)と12の剰余。 [十干No,十二支No]で戻る。 ここまで。 #----------------------------------------------- #---暦注などを取得する(おまけ)-------------------- ##歴註データの配列Noを取得する(データから仮名や説明が取り出せます) ※ Sは、七十二候データの「本朝七十二候」(全て漢字)、または「仮名」(すべてひらがな)に合致していること。 ※ 読下・仮名・二十四節気・初次末・新暦・説明 ●(Sの)七十二候No取得 項目とは変数=「本朝七十二候」。 もし、(Sがかなか判定)=はいならば、項目=「仮名」 七十二候データを反復 もし、対象[項目]=Sならば、対象キーで戻る。 ここまで。 空で戻る。 ここまで。 ※ 仮名・新暦・旧暦・節中・暦便覧・干支・太陽視黄経・説明 ●(Sの)二十四節気No取得 二十四節気データを反復 もし、対象["二十四節気"]=Sならば、対象キーで戻る。 ここまで。 空で戻る。 ここまで。 ※ 仮名・動物・時刻・方位・五行・旧暦・説明 ●(Sの)十二支No取得 十二支データを反復 もし、対象["十二支"]=Sならば、対象キーで戻る。 ここまで。 空で戻る。 ここまで。 ※ 仮名・読み・意味・説明 ●(Sの)十干No取得 十干データを反復 もし、対象["十干"]=Sならば、対象キーで戻る。 ここまで。 空で戻る。 ここまで。 ##六曜 //1582/10/15以降はグレゴリオ暦、それ以前はユリウス暦として六曜を取得(v1非互換。1582/10/15より前の日付で結果が異なる) ●(西暦の|西暦で|西暦を)六曜取得 六曜とは変数=「大安,赤口,先勝,友引,先負,仏滅」を「,」で区切る。 旧暦とは変数=西暦から旧暦取得。 旧暦=旧暦を「/」で区切る。変数 月=旧暦[1]。 もし、(月の1だけ文字左部分)=「閏」ならば、月の1から1文字削除。#月の「閏」を省く。 六曜[(月+旧暦[2])%6]で戻る。 ここまで。 ##年の九星 ●(日付を|日付の|日付で)年家九星取得 変数 九星=「一白水星,二黒土星,三碧木星,四緑木星,五黄土星,六白金星,七赤金星,八白土星,九紫火星」を「,」で区切る。 日付は日付を英数半角変換して、「/」を「/」に置換。 日付を「/」で区切る。 変数 西暦年=それ[0] 変数 立春=西暦年の「立春」を二十四節気日付取得。 もし、(日付の修正ユリウス日取得)<(立春の修正ユリウス日取得)ならば、西暦年=西暦年-1。 変数 数=11-西暦年%9-1。 もし、数≧9ならば、数=数-9。 九星[数]で戻る ここまで。 ##日の九星 //https://ja.wikipedia.org/wiki/%E4%B9%9D%E6%98%9F#%E6%97%A5%E3%81%AE%E4%B9%9D%E6%98%9F //http://koyomi8.com/sub/9sei.htm?2022 ●(日付を|日付の|日付で)日家九星取得 変数 九星=「一白水星,二黒土星,三碧木星,四緑木星,五黄土星,六白金星,七赤金星,八白土星,九紫火星」を「,」で区切る。 変数 データ=空配列。 #修正ユリウス日,干支,切替日,開始九星 変数 日付U=日付の修正ユリウス日取得。 日付は日付を英数半角変換して、「/」を「/」に置換。 日付を「/」で区切る。 変数 西暦年=それ[0] 変数 [C,年,二至,切替日,開始九星,陰陽]=空。 6回 C=回数-1。年=西暦年+(INT(C/2)-1)。 データ[C]=空配列。 もし、C%2=0ならば、 二至=「夏至」。データ[C][3]=8。 違えば、 二至=「冬至」。データ[C][3]=0。 ここまで。 # 日家九星を求めたい日を含む年、およびその前年・翌年の夏至と冬至の修正ユリウス日と干支(No)を求める。 データ[C][0]=年の二至を二十四節気日付取得して、それの修正ユリウス日取得。 データ[C][1]=(それ+50)と60の剰余。 # 陽遁・陰遁の切替日の日付を求める。 もし、データ[C][1]≦28ならば、 データ[C][2]=データ[C][0]-データ[C][1]。 違えば、もし、データ[C][1]≧32ならば、 データ[C][2]=データ[C][0]+(60-データ[C][1])。 違えば、 データ[C][2]=データ[C][0]+(30-データ[C][1])。 もし、二至=「夏至」ならば、データ[C][3]=2。 違えば、データ[C][3]=6。 # 閏が連続した場合の調整 もし、C>0ならば、 もし、データ[C][2]-データ[C-1][2]=210でなければ、 データ[C-1][2]=データ[C-1][2]-30。 もし、二至=「夏至」ならば、データ[C-1][3]=0。 違えば、データ[C-1][3]=8。 ここまで。 ここまで。 ここまで。 ここまで。 # 見逃された閏の調整。 4回 C=回数。 もし、データ[C][2]-データ[C-1][2]=240ならば、 データ[C][2]=データ[C][2]-30。 もし、C%2=1ならば、データ[C][3]=6。 違えば、データ[C][3]=2。 ここまで。 ここまで。 //データをJSONエンコード整形して表示 # 求める日付の切替日。 数を1から(データの要素数)-1まで繰り返す もし、日付U<データ[数][2]ならば、 切替日=データ[数-1][2]。開始九星=データ[数-1][3]。陰陽=(数-1)%2。 抜ける。 ここまで。 ここまで。 //「{切替日},{開始九星},{陰陽}」を表示 # 求める。 もし、陰陽=1ならば、 九星[(日付U-切替日+開始九星)と9の剰余]で戻る。 違えば、 九星[開始九星-(日付U-切替日)と9の剰余]で戻る。 ここまで。 ここまで。 #------------------------------------------------------------ もし、プラグイン名=「メイン」ならば、 日付は今日。MJD=日付の修正ユリウス日取得。 和暦=日付の西暦和暦変換。 旧暦=日付の西暦旧暦変換。 一覧=「{日付}の暦{改行}新暦:{和暦}{改行}旧暦:{旧暦}{改行}」。 No=日付の二十四節気範囲番号取得。 二十四節気=二十四節気データ[No]["二十四節気"]。 開始=(今年の二十四節気を二十四節気日付取得)の「{今年}/」を空に置換。 終了=(今年の二十四節気データ[No+1]["二十四節気"]を二十四節気日付取得)に「-0/0/1」を日付加算して、「{今年}/」を空に置換。。 一覧=一覧に「二十四節気:{二十四節気}({開始}~{終了})」を一行追加。 No=日付の七十二候範囲番号取得。 七十二候=七十二候データ[No]["本朝七十二候"]。 開始=(今年の七十二候を七十二候日付取得)の「{今年}/」を空に置換。 終了=(今年の七十二候データ[No+1]["本朝七十二候"]を七十二候日付取得)に「-0/0/1」を日付加算して、「{今年}/」を空に置換。。 一覧=一覧に「七十二候:{七十二候データ[No]["読下"]}({開始}~{終了})」を一行追加。 西暦干支=日付の干支取得。一覧=一覧に「西暦干支:{西暦干支}」を一行追加。 旧暦干支=日付の旧暦干支取得。一覧=一覧に「旧暦干支:{旧暦干支}」を一行追加。 節切干支=日付の節切干支取得。一覧=一覧に「節切干支:{節切干支}」を一行追加。 六曜=日付の六曜取得。一覧=一覧に「六曜:{六曜}」を一行追加。 年九星=日付の年家九星取得。一覧=一覧に「年九星:{年九星}」を一行追加。 日九星=日付の日家九星取得。一覧=一覧に「日九星:{日九星}」を一行追加。 一覧を表示。 ここまで。