2019-04-07
祝 新元号発表! で、西暦→元号変換してみる
なでしこ3 |
https://news.mynavi.jp/article/nadeshiko-43/
これは、このタイミングで絶対出ると思っていましたよ~☆
ワタシも、和暦変換するのを作ろうと思っていたけど、間に合わなんだorz
記事の最後に、明治以前の和暦にも対応することについて、さらっと触れられていました。
実は、これは、ガチでやろうとすると本当は、思うほど簡単なことではありません。
明治六年(1873年)の、グレゴリオ暦導入以前の和暦は旧暦なので、西暦と単純に対応させることが出来ないんですね。
例えば、なでしこ3にはまだありませんが、なでしこ1には「和暦変換」とゆう命令があり、「1868/01/01」までの西暦を変換してくれることになっていますが、旧暦には対応していないため『「1868/01/01」を和暦変換して表示』とすると、『明治元年1月1日』と返ってきますが、実際には『慶応3年12月7日』です。
まあ、明治までなら、こうゆう仕様ですと言い張ることも可能かと思いますが、有効な日付を「日本でグレゴリオ暦が採用された明治6年1月1日(1873/01/01)以降」、とするのが本当であろうかとも思われます。
そして、明治以前にも対応するとなると、ちょっとそう言うわけには行かないです。
日付まで対応しようとすると、改元日のデータと、さらには旧暦のデータも必要になってくる。
(グレゴリオ暦導入後ならば、改元日が無くても、その年の1/1に遡って新元号とする立年改元としても良いのですが、旧暦の場合、その立年改元で遡るべき1/1自体が西暦とは一致しないので)
そしてさらに、西暦にグレゴリオ暦が採用される以前の西暦は、ユリウス暦ということにするのかグレゴリオ暦のまま遡るのか、とゆう問題にも直面する。
あー、アタマ痛い(@_@)
てゆうかもう、具合わるい(´д`)
さてさてそれでは、日付のことは考えずざっくりと、西暦年を入れたら元号年に変換するだけならば、元号の開始年と終了年を「大化」から「令和」まで全て用意すれば、マイナビの記事のとうりで、すんなりとできるでしょうか?
答えは、否です。
例えば、安政は1855年~1860年なのですが、かの桜田門外の変が安政7年3月3日であることで分かるように、7年まであります。
ところが、単純に当てはめていくと・・・
1855 嘉永7年/安政元年 1856 安政2年 1867 安政3年 1868 安政4年 1859 安政5年 1860 安政6年/万延元年
・・・あれ、いっこ足りない?! となります。
これは、安政への改元が、和暦では年明け前、西暦では年明け後の嘉永7年11月27日(1855/01/15)に行われたために起こります。安政元年は1ヶ月ちょいしかありません。
西暦1855年は、1/14までは嘉永7年、1/15~2/16の間だけ安政元年、2/17以降は安政2年なんですよ~ん。
1854 嘉永7年 1855 嘉永7年/安政元年/安政2年 1856 安政3年 1867 安政4年 1868 安政5年 1859 安政6年 1860 安政7年/万延元年
どうすりゃいいんだ?
やっぱ、1860年=安政7年=万延元年とするためには、1855年=安政2年とゆうことにして帳尻を合わせるしか無い。
しかし、1854年は嘉永7年で、嘉永最後の年だけど安政元年では無いので、安政元年は存在し無いコトになっちゃうけど、仕方がない!・・・のか?
このような元号が、12個もあります。
プログラム的には?
どーすりゃいいんだ??
単純に、こうなっちゃう元号の場合にだけ、Vをさらに+1にする・・・?
あと、1年間続かず年内に改元となった元号が3つありますが、それも無かったことになっちゃいますが、コレもどうしようもない・・・のか?
考え方としては、指定された西暦年の最終日、12/31時点での元号を、その年の元号と見なして表示する・・・的なことになりますかね?
南北朝時代は、正統とされる南朝側の元号を表示することにする。
・・・でっ、こんな感じ?
#---宣言---------- 元号一覧URL=「gengo_s.csv」 時代区分URL=「jidai.csv」 和暦表=空配列。特殊元号1=空。特殊元号2=空。 西暦年=今年。西暦年エディタ=空。 時代一覧=空配列。 時代区分URLへGET送信した時には 対象をCSV取得し、それを時代一覧へ代入。 ここまで。 元号一覧URLへGET送信した時には 対象をCSV取得し、それを和暦表へ代入。 和暦表を反復 もし、対象[1]=対象[2]ならば、特殊元号1=特殊元号1&「・」&対象[0]。ここまで。 もし、(対象[3]の1だけ文字左部分)=「*」ならば、特殊元号2=特殊元号2&「・」&対象[0]。ここまで。 ここまで。 特殊元号1=特殊元号1の1から1だけ文字削除。特殊元号2=特殊元号2の1から1だけ文字削除。 #---GUI作成---------- HTML = 「 <div class="nako3"> 指定された西暦年を元号年に変換します。<BR> 1年続かず年内に改元した元号は無視されます。({特殊元号1})<BR> 西暦では年が明け、和暦では年明け前に改元が行われた元号では、元年と2年が同じ年になるため、元年が表示されません。<BR> ({特殊元号2})<BR> 南北朝時代は南朝側の元号を使用。<BR> 時代区分は『広辞苑第七版付録 西暦・和暦対照表』による。<BR> <p><div id="gui"></div></p> <p><div id="result"> </div></p> </div> 」 「#nako3_div_1」にHTMLをHTML設定。 「#result」に{ "padding": "16px", "border": "1px solid #FF7979", "背景色": "#FFF4F4" }をDOMスタイル一括設定。 「#gui」にDOM親要素設定。 改行作成。 「西暦 」のラベル作成。 西暦年のエディタ作成して、西暦年エディタに代入。 「年」のラベル作成。 改行作成。改行作成。 「西暦和暦変換処理」のボタン作成して、変換ボタンに代入。 「 」のラベル作成。 「クリア」のボタン作成して、クリアボタンに代入。 西暦年エディタの「幅」に「80px」をDOMスタイル設定。 変換ボタンをクリックした時には 西暦年=西暦年エディタからテキスト取得。 西暦年=西暦年を英数半角変換。 和暦年=西暦年を西暦和暦変換処理。 年干支=西暦年の年干支取得。 時代区分=西暦年の時代区分取得。 「#result」に「{和暦年} {年干支} {時代区分}」をテキスト設定。 ここまで。 クリアボタンをクリックした時には、 西暦年エディタに空をテキスト設定。 ここまで。 ここまで。 ●(西暦年を)西暦和暦変換処理とは もし、西暦年<645ならば、「元号制定以前」で戻る。 違えば、 和暦表を反復 # 表から値を取り出す 和暦名=それ[0] 開始年=それ[1] 終了年=それ[2] 改元日=それ[3] # 指定した西暦に該当するか調べる もし(開始年≦西暦年)かつ(西暦年<終了年)ならば、 和暦年=西暦年-開始年+1。 もし、(改元日の1だけ文字左部分)=「*」ならば、和暦年=和暦年+1。 もし、和暦年=1ならば、和暦年=「元」。 「{和暦名}{和暦年}年」で戻る。 ここまで。 ここまで ここまで。 「不明」で戻る。 ここまで。 ●(西暦年の)年干支取得 十二支=「子丑寅卯辰巳午未申酉戌亥」を文字列分解。 十干=「甲乙丙丁戊己庚辛壬癸」を文字列分解。 干支は空配列。 60回 C=回数-1 干支[C]=「{十干[C%10]}{十二支[C%12]}」 ここまで。 干支No=西暦年%60-4。 もし、干支No<0ならば、干支No=干支No+60。 干支[干支No]で戻る。 ここまで。 ●(西暦年の)時代区分取得 時代一覧を反復 もし、対象[2]≧西暦年ならば、対象[0]で戻る。ここまで。 ここまで。 ここまで。
http://snowdrops.starfree.jp/wnako3_test/17_gengo.html
タブン合っていると思うんだけど・・・
干支と時代区分も表示してみたケド、よく考えたら、こんな風に表示するなら、その年に含まれる元号を全て併記するようにしても良かったのだ;
まあめんどーだし、西暦と和暦を1対1で取得したい場合とゆうことで(^▽^;
本当は、なでしこ1の和暦変換みたいに日付で、改元日も反映させてずっと昔まで変換出来るようにしたいと思うんだけど、カナリ挫折中(+_+)
そもそも旧暦と一口に言ったって、本当なら幾度も改暦が行われてますけど、そこはどーしますか?! などとゆうさらなる問題にも直面したりするわけです。
うう、それはムリ・・・(>_<;;;
【追記】
その後ウィキペディアを見たところ、「実際とはずれが生じる」としながらも、「嘉永7年=安政元年=西暦1854年」にしちゃう感じのようでした。
立年改元(その年の1/1に遡って新元号とする)として考えれば、嘉永7/安政元年の1/1は、西暦では1854/01/29なので、そっから安政元年は始まってるのだと言い張ることも可能っちゃ可能。
いっこいっこ検索する場合ならともかく、一覧で出力した時とか、元年が無いのもかなり違和感があるし、そっちのほうがいいかなぁ?
その場合は、プログラムでどうこうするより、ちょこっとデータを変えちゃった方が、楽だねw