HTML時刻入力:24時間制の値・min・max・stepと秒

HTML input type="time" は時刻を受け入れます。インターフェースがAM/PMを表示していても、値は一般的に09:30のような24時間形式の文字列、または秒を含む場合は13:10:20です。min/maxは範囲を設定し、stepは秒単位の間隔を設定します。

表示形式を値と区別する

入力UIは、オペレーティングシステム、ブラウザ、ユーザーの言語によって異なります。すべてのドロップダウンやピッカーが同じように見えるとは期待しないでください。初期値には1:30 PMのようなローカライズされた表示テキストではなく、13:30のような有効な文字列を入力してください。初期値はvalue属性で設定し、現在のユーザー選択はinput.valueで読み取ります。

時間値には日付やタイムゾーンは含まれません。午前9時がソウルか他の場所かを判断することはできません。実際の瞬間を特定する予約の場合は、日付と基準タイムゾーンも収集してサーバー側で一貫して解釈してください。90分のような期間の場合、時刻のコントロールを再利用するのではなく、分単位の数値のような適切な形式を選択してください。

範囲と間隔を設定する

属性 例 意味
value 09:30 初期時間;範囲やステップ、形式に適合している必要があります。
min、max 09:00、18:00 許可される時間の包括的な境界。
step 900 900秒は15分です。デフォルトの60は1分、1は1秒です。
required ブール属性 空の場合、通常の送信をブロックします。
name meeting 送信されるフィールド名;idだけではデータ名は作成されません。

間隔の基準は、有効なminがあればその値、なければHTMLの有効なvalue属性、どちらもなければ00:00:00です。有効なHTMLのvalue属性がある場合はそれを使用し、どちらもない場合は深夜を使用します。min="09:00" step="900"の場合、09:00、09:15、および09:30は有効ですが、09:10は適合しません。これは利用可能な予約枠や休業日を決定するものではなく、サービスルールは別途実装してください。

完全な例:15分間隔と秒

このコードをtime.htmlとして保存し、ブラウザで開いてください。検証および送信された値を確認するためにサーバーは必要ありません。2つ目の入力では、秒を許可するために明示的にstep="1"を使用しています。

<!doctype html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>時刻の範囲と秒単位の入力</title>
  <style>
    body { margin: 24px; font-family: sans-serif; }
    label { display: block; margin: 16px 0 6px; }
    input { max-width: 100%; box-sizing: border-box; }
    pre { white-space: pre-wrap; overflow-wrap: anywhere; }
  </style>
</head>
<body>
  <h1>時刻を選択</h1>
  <form id="demo">
    <label for="meeting">会議時刻(09:00–18:00、15分間隔)</label>
    <input id="meeting" name="meeting" type="time"
      min="09:00" max="18:00" step="900" value="09:30" required>
    <label for="checkpoint">点検時刻(13:00–15:00、1秒間隔)</label>
    <input id="checkpoint" name="checkpoint" type="time"
      min="13:00:00" max="15:00:00" step="1" value="13:10:20" required>
    <p><button type="submit">送信値を確認</button>
      <button type="reset">初期化</button></p>
  </form>
  <pre id="result" aria-live="polite"></pre>
  <script>
    const form = document.querySelector('#demo');
    const result = document.querySelector('#result');
    form.addEventListener('submit', (event) => {
      event.preventDefault();
      result.textContent = JSON.stringify([...new FormData(form).entries()], null, 2);
    });
    form.addEventListener('input', () => { result.textContent = ''; });
    form.addEventListener('reset', () => { result.textContent = ''; });
  </script>
</body>
</html>
  1. 最初に送信:meetingは09:30であり、checkpointは13:10:20です。出力はUIがAM/PMを使用していても24時間形式です。
  2. ミーティング時間を08:45に設定すると範囲バリデーションに失敗します。09:10は範囲内ですが、15分刻みのステップで失敗します。09:45は正常に送信されます。
  3. ミーティング時間を完全にクリアして送信し、必須バリデーションを確認します。有効な時間を復元した後、2番目の入力で秒を変更して秒単位の出力を比較します。
  4. チェックポイントのstep="1"のみをstep="60"に変更し、ファイルを再度開きます。初期の13:10:20は13:00:00から1分刻みのステップから20秒ずれており、無効です。その後、ステップを1に戻します。
  5. リセットにより、ミーティングが09:30に、チェックポイントが13:10:20に復元されます。

深夜をまたぐ範囲とサーバーバリデーション

時間入力は、深夜をまたぐ範囲を表現できます。たとえば、min="22:00" max="02:00" は午後10時から深夜を経て午前2時までを意味します。これは実際の日付を含む間隔ではないため、自動的に翌日の日付を選択することはありません。ターゲットブラウザでこの検証のサポートを確認し、サーバーでも同じルールを実装してください。

ブラウザの時刻選択UIや検証メッセージは、サーバー側の検証を代替できません。サーバーは、受信した文字列の形式、範囲、ステップを確認し、それを必須の日付、タイムゾーン、予約可能性と組み合わせてチェックする必要があります。GET URL の %3A はエンコードされたコロンであり、フォーム値を通常通り解析すると 09:30 のような文字列が得られます。

日付も必要ならdate入力の日付値と範囲を参照してください。時刻形式と属性の詳細はMDNのtime入力リファレンスで確認できます。