(Sample)
今回は、「過去の日付を選べない日付フォーム」を作る方法を初心者向けに丁寧に解説します。
予約システムや日程調整フォームなどで、「今日より前は選ばせたくない!」という場面、よくありますよね。
この機能はHTML+JavaScriptだけで実現できます!
どんな動作になるの?
フォームには日付選択欄がありますが…
- 今日より前の過去の日付はカレンダーに表示されず、選べません。
 - 今日の日付〜未来だけが選択可能になります。
 
HTMLの基本構造を確認
<form>
    <label for="date">過去の日付は選択できません:</label>
    <input type="date" id="date" name="date">
    <input type="submit" value="送信">
</form>
ポイント
| 要素 | 内容 | 
|---|---|
<input type="date"> | 日付選択フォーム。モバイルでは専用カレンダーUIが表示されます。 | 
id="date" | JavaScriptで操作するための識別子です。 | 
JavaScriptで「今日の日付以降」に制限
document.addEventListener("DOMContentLoaded", function() {
    const dateInput = document.getElementById('date');
    const today = new Date();
    const year = today.getFullYear();
    const month = String(today.getMonth() + 1).padStart(2, '0');
    const day = String(today.getDate()).padStart(2, '0');
    const minDate = `${year}-${month}-${day}`;           
    dateInput.setAttribute('min', minDate);
});
専門用語と仕組みの解説
new Date()
JavaScriptで現在の日付と時間を取得する標準的な方法です。
例:
new Date() → Mon Jun 10 2025 10:00:00 GMT+0900
padStart(2, '0')
これは「1桁の数字を2桁にそろえる」ためのテクニックです。
たとえば「6」を「06」に変換します。
String(6).padStart(2, '0') → "06"
input.setAttribute('min', 日付文字列)
日付入力に「これより前の日付は無効」と設定しています。
これはHTMLのmin属性という標準仕様に従っています。
なぜ DOMContentLoaded を使うの?
これは「HTMLが読み込まれたら実行してね」という合図です。
フォームの要素が存在しないタイミングでJavaScriptが動いてしまうのを防ぐために必要です。
実行の流れを図解!
ページが読み込まれる
 ↓
JavaScriptが現在の日付を取得
 ↓
input[type="date"] に min="今日の日付" を設定
 ↓
ユーザーは今日以降しか選べない
よくある質問
Q. 未来の日付も制限したい場合は?
dateInput.setAttribute('max', '2025-12-31');
このように max 属性を使えば、将来の範囲も制限できます。
応用アイデア
| 応用 | 内容 | 
|---|---|
| 時間選択も追加 | type="datetime-local" を使って日付+時刻を選ばせる | 
| 「7日後までしか選べない」など | new Date(today.getTime() + 7 * 24 * 60 * 60 * 1000) で計算可能 | 
| カレンダーUIをカスタマイズ | FlatpickrやDatepickerなどの外部ライブラリとの連携も可能 | 
今後の学習ステップ
このコードを通して学べたこと:
- JavaScriptでの日付操作
 - HTMLフォームの制約属性(
min,max)の活用 padStart()などの文字列フォーマット
次はこんなことに挑戦してみましょう!
- 日付をローカルタイムゾーンで表示調整する方法
 datetime-localを使って時間指定フォームを作ってみる- 日付を選ぶと別のUIに影響を与える処理を組んでみる
 
実務でもよく使う機能なので、しっかり覚えておくと活躍できますよ!質問があればいつでも聞いてくださいね。