業界では、日付の妥当性チェックを日付論理チェックと言ったりします。(ひょっとしたら死語かもしれませんが) 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の最新記事】
- Firebase の Realtime Database の JSON を jQuery の $.ajax で読み込んで TABLE を作成する
- Firebase に定義した Realtime Database の API を使用して TABLE を作成する
- IE や Firefox の開発者ツールのコンソールで簡単に localStorage を見る為の1行コード
- テキストエリアでタブ処理
- ブラウザ判定 : String.prototype.browser に登録して、文字列と実際のブラウザが一致したら true を返す
- jQuery UI の datepicker を使用した現在の日付文字列の取得 と 一般的な現在の日付文字列の加工取得処理
- geolocation を使用して『都道府県選択コンボボックス』の初期値を現在の緯度・経度から選択する
- 雪を降らす snowstorm.js の 特定 DIV 内での実装
- JavaScript : ブックマークレットの作り方
- いまさらですが、JavaScript で、グローバル領域を汚さない変数宣言の使用方法
- 二回目のロードは無視する、JavaScrip ライブラリの基本スケルトン
- ブックマークレットから、ページ中央に固定する IFRAME ウインドウを作成する
- JavaScript の全ての オブジェクトに同じ機能を持たせる
- JavaScript : コンボボックスの OPTION 部分の操作でたいていのテクニック
- HighslideJS 用貼り付けコード作成
- テキストエリアに入れた JSON データをチェックするコード(F12等の開発者ツールも使う) / JSON.stringify と JSON.parse
- エレメント(主にPRE)を選択状態にする
- JS : function() {} という『無名の処理』の理解
- GoogleVisualizationAPIを使用したブラウザ比率の円グラフ(2009年3月〜) / IE がまだ半分を占めてます
- Safari for windows の alert