彩りの大地 Laboratory 和暦×西暦変換

和暦×西暦変換

和暦から西暦を求める計算機


西暦から和暦を求める計算機


説明書

その通り、和暦×西暦のコンバータです。
西暦1989年のように、昭和64年と平成元年とがまたがっている場合、新年号のほうで表示されます。
平成”元”年などと入れても”1”年と認識します。それ以上は特に説明などいらないと思うので、割愛します。w

計算ボタンがないのですが、入力フォームからフォーカス(入力可能状態)が外れるたびに計算されるようにしているため、 何もないところなど、適当なところをクリックすればいいと思います。(プルダウン変更でも計算されます。)

本来は明治以前の年号についても情報を入れたかったのだけれども、配列のサイズが足りないため一時断念。 また別の手段を考えます。

ソースについて


// 以前はグローバル変数として扱っていたのですが、
// 関数呼び出しによって値を出力する形式に鞍替えしたのでこのようになりました。
function ac2jy_fixnf() {
	var i;
	var fix = [];
	fix[0] = [];
	fix[1] = [];
	

	
	return fix;
}

// 出力からinnerHTMLを使用したスクリプトでコントロールしています。
// 今回は初期値をコントロールしているのでまあまあ意味があります。w
function calct0() {
	var fix = ac2jy_fixnf();
	var inow;
	var odt = new Date();
	var oyr = odt.getFullYear();
	var tx1 = "";
	var tx2 = "";
	var nflg = 0;
	
	tx1 += "年号 \n";
	tx1 += "<select name='s0' size='1' id='jn' onchange='calct1()'>";
	for(inow = fix[0].length - 1; inow >= 0; inow--){
		if(fix[0][inow] < oyr && nflg == 0){
			qut1 += "<option selected='selected'>" + fix[1][inow] + "</option>";
			nflg = fix[0][inow];
		}
		else{
			qut1 += "<option>" + fix[1][inow] + "</option>";
		}
	}
	tx1 += "</select>";
	tx1 += " <input type='text' size='4' id='jy' value='" + (oyr - nflg + 1) + "' onblur='calct1()'> 年<br>";
	tx1 += "</form>";
	
	tx2 += "<form action='#n2' name='fm1'>";
	tx2 += "西暦 <input type='text' size='8' id='ac' value='" + oyr + "' onblur='calct2()'> 年<br>";
	
	document.getElementById('inst1').innerHTML = tx1;
	document.getElementById('inst2').innerHTML = tx2;
}

function calct1() {
	var fix = ac2jy_fixnf();
	var enjn = document.getElementById('jn').selectedIndex;
	var evjy = document.getElementById('jy').value;
	var enjy;
	var ans1;
	
	if(evjy == "元"){
		evjy = "1";
	}
	enjy = Number(evjy);
	enjn = fix[0].length - 1 - enjn;
	if(enjy < 1){
		ans1 = "不正な値を検出";
	}
	else{
		ans1 = "西暦 " + (fix[0][enjn] - 1 + enjy) + "年";
	}
	
	document.getElementById('anst1').innerHTML = ans1;
}
	
function calct2() {
	var fix = ac2jy_fixnf();
	var enac = Number(document.getElementById('ac').value);
	var ans2;
	var anjn;
	var anjy;
	
	if(enac < 0){
		ans2 = "紀元前";
	}
	else if(enac - fix[0][0] < 0){
		ans2 = "年号 " + "明治以前";
	}
	else{
		for(anjn = 0; enac - fix[0][anjn] > -1 && anjn <= fix[0].length; anjn++){
			;
		}
		anjn--;
		anjy = enac - fix[0][anjn] + 1;
		if(anjy == 1){
			anjy = "元";
		}
		ans2 = "年号 " + (fix[1][anjn] + anjy) + "年";
		
	}
	
	document.getElementById('anst2').innerHTML = ans2;
}

window.addEventListener('load', function() { 
	calct0();
	calct1();
	calct2();
},false);

能書き

恐らく、スクリプトにする必要がないような代物です(核爆)
日本では和暦と西暦の変換をもとめられる場合は少なくなく、そのたびに面倒な想いをさせられます。w
例えば、コンピュータでは基本的に西暦でないと動作しないのに、 日本でなにかしらの文書を作成するにあたり、提出は和暦でないとダメとかいうことがよくあります。

だったら、初めからコンピュータ(Excelなど)で書類を作成する段階で和暦にしてしまおうという手があります。 その方法として、たとえば上記のスクリプトでは各元年の値からきちんと算出していますが、 同じ年号内の年数であれば、以下のように算出可能です。

西暦2016年 が 平成28年 (本ドキュメントの更新日の年)
↑ポイントはここ。何年前というのはすぐには出てこないかもしれないけど、同じ年ならでてくるはず!

つまり、2016 - 28 (=1988)とすることで、平成元年の前の年(昭和63年)が算出される。
この値に29などを足すと平成29年になるし、14を足すと平成14年に……

つまり、Excelで今日の年を年号で求めようとすると、こんな感じの値になると思います。

="平成"&2016-28+YEAR(TODAY())&"年"

ソースについては、特にこれといったことはお話しませんが、注意点をいくつか。
テキストボックス(<input type='text'>)でから取得した値は、文字数値に関わらず”文字列”として扱われるため、 算術演算処理を行う上で”整数”へ変換しなくてはなりません。
一方で、セレクトボックス(<select ~>~</select>)やラジオボタン(<input type='radio'>)から取得した値については違っています。
いずれも、特に値の指定がない限りは、デフォルトでボックスの上から順に0、1、2、3......と、整数値が割り当てられます。
しかし、ソースの冒頭あたりを見ればお分かりですが、配列の要素は数値の若いほうに年数が小さくなっています。 一方で、セレクトボックスの選択肢は上から順に未来の年号のほうが格納されているため、 そのままセレクトボックスから取得した値を年数を呼び出すための関数の引数にしてしまうと不都合が起こります。 そのため、関数呼び出しをする前に、取得した値を、(「不正な値を検出」の上あたりで)格納している年数の数から引いて逆転作業を行っています。

ちなみに、チェックボックス(<input type='checkbox'>)から取得した値は、 チェックが入っていれば「true」、入っていなければ「false」となります。
これを整数変換すると、1と0という整数になります。