前回、なにかと便利なページを作成しました。
便利ページ: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ファイルです。
大化の改新から始まって、現在元年の令和までです。
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":""},
];
変換ロジックを作成する
あとは、和暦から西暦、西暦から和暦に変換するスクリプトを書いていきます。
元号一覧から対象元号を検索します。
/* 元号 */
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年)。そういったところは、上記の変換ロジックは不十分です。(困る人はいなそうなので、このままにしています)
以上