0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

JavaScriptで日付が正しいかチェックする

Last updated at Posted at 2025-05-18

JavaScriptで、YYYY/MM/DD形式の日付が正しいかチェックする

JavaScriptで、YYYY/MM/DD形式の日付が正しいかチェックするのが意外と難しかった。
探してみた範囲では、2月30日を正しい日付と判定してしまうものしか見つからなかったので、作ったものと、JEST用のテストコードをここに置きます.

/**
 * 文字列が、YYYY/MM/DD 形式の正しい日付か確認する
 * @param {*} str_date 
 * @returns 
 */
const isValidDate = (str_date) => {
    //Dateは、日付のみの書式をUTCとして解釈する。toJSONやtoISOStringは常にUTCで返す。
    const str_iso = new Date(str_date.replace(/\//g, '-')).toJSON();

    //new Date() が引数を解釈できなかったらfalseを返す。
    if (!str_iso) return false;

    // 年/月/日T時:分:秒Z の文字列のうち、Tより前の部分を取得
    const date_iso = str_iso.replace(/\-/g, '/').split('T')[0];

    //引数の文字列が正しくない日付(例:2025/02/30)だったら、
    //date_isoは違う文字列(例:2025/03/01)になる。
    return (str_date === date_iso);
};


window.isValidDate = isValidDate;
if (typeof module !== "undefined" && module.exports) {
    module.exports = { isValidDate }; //JEST用
}

JESTでテスト

JESTで実行するテストを書いた。

const { isValidDate } = require("./isValidDate");

test(
    "2月30日は正しい日付ではない", () => {
        expect(isValidDate('2025/02/30')).toBe(false);
    }
);
test(
    "全く日付では無いものは、偽と判定する", () => {
        expect(isValidDate('aaa')).toBe(false);
    }
);
test(
    "4桁/2桁/2桁ではないものは偽と判定する", () => {
        expect(isValidDate('1111/22/33/4')).toBe(false);
    }
);
test(
    "月も日にちも一桁になる日付", () => {
        expect(isValidDate('2025/01/01')).toBe(true);
    }
);
test(
    "8月末", () => {
        expect(isValidDate('2025/08/31')).toBe(true);
    }
);
test(
    "月も日にちも一桁になる日付", () => {
        expect(isValidDate('2025/09/01')).toBe(true);
    }
);
test(
    "月と日が正しくない", () => {
        expect(isValidDate('2222/33/44')).toBe(false);
    }
);
test(
    "2100年は、閏年ではない", () => {
        expect(isValidDate('2100/02/29')).toBe(false);
    }
);
test(
    "2020年は、閏年である", () => {
        expect(isValidDate('2004/02/29')).toBe(true);
    }
);
test(
    "2025年は、閏年ではない", () => {
        expect(isValidDate('2025/02/29')).toBe(false);
    }
);
test(
    "4月31日は無い", () => {
        expect(isValidDate('2025/04/31')).toBe(false);
    }
);
test(
    "13月は無い", () => {
        expect(isValidDate('2025/13/01')).toBe(false);
    }
);
test(
    "日付が正しい", () => {
        expect(isValidDate('2222/12/31')).toBe(true);
    }
);

JESTのインストールとテスト実行

この記事冒頭のコードをファイル名isValidDate.js、テストコードを isValid.spec.js として保存する。
保存したフォルダで以下を実行する。

参考: https://jestjs.io/ja/docs/getting-started

$ npm init
$ npm install --save-dev jest

package.jsonの、"scripts:"{"test": ... を、"jest"に書き換える。

  "scripts": {
    "test": "jest"
  }

テストを実行する。

$ npm test

ブラウザで動かしてみる

<!DOCTYPE html>
<html>

<head>
    <title>isValidDate動作例</title>
    <script src="./isValidDate.js"></script>
</head>

<body>
    <input onchange="validateDate(this)" placeholder="YYYY/MM/DD形式の日付">
    <span id="result"></span>
    <script>
        function validateDate(obj) {
            const is_valid = isValidDate(obj.value);
            const elem = document.getElementById("result");
            if (is_valid) {
                elem.innerText = "YYYY/MM/DD形式の日付";
            } else {
                elem.innerText = "YYYY/MM/DD形式の日付ではない";
            }
        }
    </script>
</body>

</html>
0
0
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?