JavaScript
Bootstrap
Vue.js

便利ページ:元号を変換してみた

前回、なにかと便利なページを作成しました。

 便利ページ:Javascriptでちょっとした便利な機能を作ってみた

 便利ページ:自分のQiita記事を一覧表示

今回は元号(和暦)を西暦に変換するページを追加しました。

元号は以下のWikiを参考にしています。

 https://ja.wikipedia.org/wiki/%E5%85%83%E5%8F%B7%E4%B8%80%E8%A6%A7_(%E6%97%A5%E6%9C%AC)

毎度の通り、デモページとGitHubです。

GitHub

 https://github.com/poruruba/utilities

デモページ

 https://poruruba.github.io/utilities/


元号一覧

このデータを作るのがすごくつらかったです。

こんな感じの元号データのjavascriptファイルです。

大化の改新から始まって、現在元年の令和までです。


gengou.js


const gengou_list = [
{"name":"大化","yomi":"たいか","start":645,"end":650,"extra":""},
{"name":"白雉","yomi":"はくち","start":650,"end":654,"extra":""},

・・・

{"name":"昭和","yomi":"しょうわ","start":1926,"end":1989,"extra":""},
{"name":"平成","yomi":"へいせい","start":1989,"end":2019,"extra":""},
{"name":"令和","yomi":"れいわ","start":2019,"extra":""},
];



変換ロジックを作成する

あとは、和暦から西暦、西暦から和暦に変換するスクリプトを書いていきます。

元号一覧から対象元号を検索します。


start.js

        /* 元号 */

gengou_search_era: function(era){
for( var i = 0 ; i < this.gengou_list.length ; i++ ){
if( this.gengou_list[i].name == era )
return this.gengou_list[i];
}

return null;
},
gengou_search_anno: function(anno){
for( var i = 0 ; i < this.gengou_list.length ; i++ ){
if( this.gengou_list[i].start <= anno && (this.gengou_list[i].end ? anno <= this.gengou_list[i].end : true ))
return this.gengou_list[i];
}

return null;
},
gengou_to_anno: function(){
var era_name = (this.gengou_era_name == 'その他') ? this.gengou_era_other : this.gengou_era_name;
var gengou = this.gengou_search_era(era_name);
if( !gengou ){
alert('入力が不正です。');
return;
}

var year = Number(this.gengou_era_year);
if( year <= 0 ){
alert('入力が不正です。');
return;
}

var anno_year = gengou.start + year - 1;
if( gengou.end && anno_year > gengou.end ){
alert('入力が不正です。');
return;
}
this.gengou_anno_year = anno_year;
},
gengou_to_era: function(){
var year = Number(this.gengou_anno_year);
var gengou = this.gengou_search_anno(year);
if( !gengou ){
alert('入力が不正です。');
return;
}

if( gengou.name == '令和' || gengou.name == '平成' || gengou.name == '昭和' || gengou.name == '大正' || gengou.name == '明治' ){
this.gengou_era_name = gengou.name;
}else{
this.gengou_era_name = 'その他';
this.gengou_era_other = gengou.name;
}

this.gengou_era_year = year - gengou.start + 1;
},



補足

ちなみに、元号は大化から全部入れているのですが、まあ、あまり使わないでしょう。

もし使う場合の注意点なのですが、途中複数の元号が同時に存在していた時期があるようです(1329年から1394年のあたり)。また、大化の後でも、元号が存在しない時期があるようです(654年、686年)。そういったところは、上記の変換ロジックは不十分です。(困る人はいなそうなので、このままにしています)

以上