閏年と日付存在チェック

Create:2004/02/18, update:2004/02/18

 

JavaScriptによる閏年と日付存在チェック

日付存在チェックにかかせないのが、2月の閏年を考慮にいれないといけないこと。考え方は簡単なのですが、事前にチェックをしておかないとデータベースに設定するときや他の処理で大きな問題となってしまう厄介物・・・。

私は下記の様に処理しますが、そのまえに閏年の考え方をしっかりと理解する必要があります。

グレゴリウス暦
閏年(うるうどし)のはなし・・現在の暦

処理内容は、以下のとおり


// 閏年のチェック
function ChkURU(number) {
    yy = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 29);

    wYear  = number.substr(0, 4);
    wMonth = wMChk = number.substr(4, 2);
    wDay   = number.substr(6, 2);

    // 年の範囲検証
    if (!(wYear >= 2000 && wYear <= 2100)) {
        alert("年の指定が正しくありません");
        return false;
    }

    // 月の範囲検証
    if (!(wMonth >= 1 && wMonth <= 12)) {
        alert("月の指定が正しくありません");
        return false;
    }

    // 閏年の判定
    if (!(wYear % 4) && wMonth == 2) {
        wMChk = 12;     // 閏年テーブル

        //if (!(!(wYear % 100) && (wYear % 400))) {
        if (!(wYear % 100)) {
            if (wYear % 400) {
                wMChk = 1;      // non閏年テーブル
            }
        }
    } else {
        wMChk--;
    }

    // 日の範囲検証
    if (!(1 <= wDay && yy[wMChk] >= wDay)) {
        alert("日付の指定が間違ってます");
        return false;
    }

    return true;
}

JavaScriptの組み込み方法

JavaScriptを組み込む場合は、直接htmlファイルに記述する方法か、別のJavaScript専用のファイルを用意して記述する方法があります。

■直接htmlファイルに記述する方法

<script language="JavaScript">
<!--

目的の処理

// -->
</script>

■別のJavaScript専用のファイルにて記述する方法

<script language="JavaScript" src="xxx.js"></script>

上記のどちらでも記述できますが、私は修正する時の苦労とJavaScriptの共通化を考えると、ファイルにて記述するのがベストだと思います。その方が画面と制御を別々に作る事も可能ですしなんといってもbugを発見しやすいというメリットがあるからです。

JavaScriptを組み込む

私は下記の様に submit ボタンを使わず、それぞれのボタンが押された時に別々の処理を実行できるようにしてます。この手法だとデバッグも楽だし制御もしやすいのでは?と思うのですが、みなさま如何でしょうか?

■htmlファイル

<form name="my_form" method="POST" action="hoge.pl">
    <input type="text" name="in_box" size="7" maxlength="6"></td>

    <input name="reset" type="reset" value="リセット">&nbsp;&nbsp;&nbsp;
    <input class="button" type="button" name="exec" value="実行" onclick="submitCheck()">
</form>

■JavaScriptファイル

function submitCheck() {
    var sin_box = document.my_form.in_box.value;
    var pin_box = document.my_form.in_box;

    // 必須入力チェック
    if ( sin_box == "") {
         alert("必須入力です");
         pin_box.focus();
         return false;
    }

    // チェック処理
    if ( !上記の処理関数名(sin_box)) {
         pin_box.focus();
         return false;
    }

    document.my_form.submit();
}
[..戻る..]