SQLの窓

2014年05月24日

JavaScript : 文字列で表現された日付を論理チェック

業界では、日付の妥当性チェックを日付論理チェックと言ったりします。(ひょっとしたら死語かもしれませんが)

JavaScript の Date オブジェクトの実装は試してみると解りますが、結構中途半端です。結局日付チェックとしては後述のような結構長い記述になってしまいます。

"2014/03/01".isDate() とかすると、true が返ります。

あと、通常は未入力をエラーとしたくないので "".isDate() は true が返ります。

フォーマットチェックは、/^\d{4}\/[\d]+\/[\d]+$/ です。
<script type="text/javascript">
String.prototype["isDate"] = function() {
	var str = this.valueOf();
	if ( str == "" ) {
		return true;
	}
	if ( !str.match(/^\d{4}\/[\d]+\/[\d]+$/) ) { 
		return false; 
	} 
	var parts = str.split( "/" );
	var nYear = Number(parts[0]); 
	var nMonth = Number(parts[1]) - 1;
	var nDay = Number(parts[2]);
	// 月,日の妥当性チェック 
	if ( 0 <= nMonth && nMonth <= 11 && 1 <= nDay && nDay <= 31 ) { 
		var dt = new Date(nYear, nMonth, nDay); 
		if( isNaN(dt) ) { 
			return false; 
		}
		else if(
			dt.getFullYear() == nYear &&
			dt.getMonth() == nMonth &&
			dt.getDate() == nDay ) {
			return true;
		}
		else{ 
			return false;
		}
	}
	else{ 
		return false;
	}
};

var str = "2014/2/29";
console.log(str.isDate());

</script>
このコードで重要な部分は( このチェックと言うより、Date オブジェクトの特性 )
if(
	dt.getFullYear() == nYear &&
	dt.getMonth() == nMonth &&
	dt.getDate() == nDay ) {
	return true;
}
のところで、new Date(nYear, nMonth, nDay) で渡す 月と日で正しく無い内容でも、起点となる日付の経過日数として換算して、オブジェクトが作成されてエラーとならないからです。出来上がった日付と、最初の文字列が同じならば意図した結果ですが、そうで無い場合はいわゆる『論理エラー』となっています。
【JavaScriptの最新記事】
posted by at 2014-05-24 00:53 | JavaScript | このブログの読者になる | 更新情報をチェックする


Android SDK ポケットリファレンス
改訂版 Webデザイナーのための jQuery入門
今すぐ使えるかんたん ホームページ HTML&CSS入門
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX