「営業時間中だけ送信を受け付ける」「平日の受付時間だけ機能を有効にする」など、時間帯で処理や機能を制御したい場面は業務アプリや予約サイトでよくあります。JavaScriptで現在時刻を判定すれば実装できますが、業務・予約用途ではクライアントの時計は信用しきれないという前提を外すと事故になります。この記事では、正しく時間帯を判定する方法と、確実に制御するための考え方を整理します。
- 分単位で営業時間を判定する関数
- タイムゾーンを日本時間(Asia/Tokyo)に固定する方法
- 深夜をまたぐ時間帯(22:00〜翌5:00)への対応
- 送信ボタンや機能を時間外に止める(機能ゲート)
- クライアント時刻は改ざんできるため、サーバー時刻で判定する方法
OR で判定します。時間帯で表示を出し分けたいだけなら時間帯・曜日・期間で表示を切り替える完全ガイドが向いています。分単位で営業時間を判定する
時刻を「分単位の整数」に変換すると、09:30〜17:45 のような範囲も不等号だけで判定できます。
function isWithinTimeRange(start, end, date = new Date()) {
const cur = date.getHours() * 60 + date.getMinutes();
const [sh, sm] = start.split(":").map(Number);
const [eh, em] = end.split(":").map(Number);
const s = sh * 60 + sm;
const e = eh * 60 + em;
return cur >= s && cur < e;
}
if (isWithinTimeRange("09:30", "17:45")) {
console.log("受付時間内です");
} else {
console.log("受付時間外です");
}
タイムゾーンを日本時間に固定する
new Date().getHours() は閲覧者のPCのタイムゾーンで時刻を返します。海外からのアクセスや、タイムゾーン設定がずれた端末では、意図しない判定になります。「日本時間で営業9〜17時」を正しく扱うには、Asia/Tokyo に固定した時刻を使います。
// 端末のタイムゾーンに関わらず「日本時間の Date 相当」を得る
function nowInJst() {
const jst = new Date().toLocaleString("en-US", { timeZone: "Asia/Tokyo" });
return new Date(jst);
}
// 第3引数に日本時間を渡せば、どの地域からでも同じ判定になる
if (isWithinTimeRange("09:00", "17:00", nowInJst())) {
console.log("日本時間で営業時間内です");
}
タイムゾーンを固定しないと、ロサンゼルスの利用者にとっての「9時」と日本の「9時」は別の瞬間です。営業時間・受付時間のようにサイト運営者の地域時刻が基準になる判定では、必ず固定します。タイムゾーンやUTC変換の詳細は日時の計算まとめ(タイムスタンプ・UTC変換・タイムゾーン)を参照してください。
深夜をまたぐ時間帯に対応する
「22:00〜翌5:00」のように日付をまたぐ範囲は、開始が終了より大きくなります。開始 ≦ 終了なら AND、開始 > 終了(日またぎ)なら OR で判定します。
function isWithinTimeRange(start, end, date = nowInJst()) {
const cur = date.getHours() * 60 + date.getMinutes();
const [sh, sm] = start.split(":").map(Number);
const [eh, em] = end.split(":").map(Number);
const s = sh * 60 + sm;
const e = eh * 60 + em;
return s <= e
? cur >= s && cur < e // 同じ日の中(例 09:30〜17:45)
: cur >= s || cur < e; // 深夜またぎ(例 22:00〜翌05:00)
}
console.log(isWithinTimeRange("22:00", "05:00")); // 23:30 や 03:00 で true
平日の営業時間だけ機能を有効にする
曜日も加味して「平日 9〜18時だけ機能を使える」ようにします。ここでは表示の切り替えではなく、ボタン(機能)の有効・無効を制御します。
function isWeekdayBusinessHours(date = nowInJst()) {
const day = date.getDay(); // 0:日, 1〜5:平日, 6:土
const isWeekday = day >= 1 && day <= 5;
return isWeekday && isWithinTimeRange("09:00", "18:00", date);
}
const btn = document.getElementById("submit-btn");
btn.disabled = !isWeekdayBusinessHours(); // 時間外は押せない
チャットボタンやバナーを時間帯で表示・非表示したい場合は、挨拶・営業時間表示・リアルタイム更新までまとめた時間帯・曜日・期間で表示を切り替える完全ガイドが適しています。この記事は処理・機能の実行制御に焦点を当てています。
受付時間外は送信を止める
予約フォームなどで「受付時間外は送信させない」場合は、送信時に時刻をチェックします。
document.getElementById("reserve-form").addEventListener("submit", (e) => {
if (!isWithinTimeRange("10:00", "16:00", nowInJst())) {
e.preventDefault();
alert("受付時間外のため送信できません(受付 10:00〜16:00)");
}
});
連打や二重送信の防止と組み合わせると、より堅牢になります。送信ボタンの二重クリックを防止する方法やボタンの連打を防止する方法も合わせてご覧ください。
【重要】クライアントの時刻は信用できない
ここまでの判定はすべて閲覧者のPC時計に基づきます。ユーザーは時計を自由に変更でき、開発者ツールでJavaScriptの判定を書き換えることもできます。そのため、「受付時間外は本当に受け付けない」といった重要な制限は、必ずサーバー側でも判定してください。フロントの制御は「無駄な操作を減らす」UX目的と割り切ります。
厳密さが必要なら、サーバーから現在時刻を取得して判定します。これなら端末の時計やタイムゾーンに左右されません。
// サーバーが現在時刻(ISO文字列)を返すエンドポイントを用意しておく
async function getServerTime() {
const res = await fetch("/api/time");
const { now } = await res.json(); // 例: { "now": "2026-06-25T09:30:00+09:00" }
return new Date(now);
}
getServerTime().then((serverNow) => {
if (isWithinTimeRange("09:00", "17:00", serverNow)) {
console.log("サーバー時刻で営業時間内");
}
});
サーバー時刻を取得して判定しても、送信の受理可否はサーバー側の処理でも必ずチェックします。フロントはあくまで先回りの案内、サーバーが最終判断という二段構えが安全です。
よくある質問(FAQ)
new Date().toLocaleString("en-US", { timeZone: "Asia/Tokyo" }) で日本時間に変換してから判定します。これで端末のタイムゾーンに関わらず、常に日本時間基準で営業時間を判定できます。cur >= s || cur < e の OR 判定にします。同じ日の中なら cur >= s && cur < e の AND 判定です。setInterval で定期的に再判定すると、営業終了時刻をまたいでも自動で切り替わります。詳しくはsetTimeout / setInterval の使い方を参照してください。まとめ
- 分単位判定:時刻を
時*60+分の整数にして不等号で比較 - タイムゾーン:営業時間判定は
Asia/Tokyoに固定する - 深夜またぎ:開始>終了なら
OR判定 - 機能ゲート:
disabledや送信時チェックで時間外の操作を止める - クライアント時刻は改ざん可能:重要な制限はサーバー時刻・サーバー処理で判定
- 表示の出し分けだけなら1455の完全ガイドへ
フロントは「先回りの案内」、サーバーが「最終判断」という二段構えにすれば、業務アプリや予約サイトでも安全に時間帯制御を実装できます。

