【JavaScript】特定の時間帯だけ処理を実行する方法|営業時間判定・タイムゾーン固定・サーバー時刻での制御まで

【JavaScript】特定の時間帯だけ処理を実行する方法|業務アプリや予約制サイト向け実装例 JavaScript

「営業時間中だけ送信を受け付ける」「平日の受付時間だけ機能を有効にする」など、時間帯で処理や機能を制御したい場面は業務アプリや予約サイトでよくあります。JavaScriptで現在時刻を判定すれば実装できますが、業務・予約用途ではクライアントの時計は信用しきれないという前提を外すと事故になります。この記事では、正しく時間帯を判定する方法と、確実に制御するための考え方を整理します。

この記事でわかること

  • 分単位で営業時間を判定する関数
  • タイムゾーンを日本時間(Asia/Tokyo)に固定する方法
  • 深夜をまたぐ時間帯(22:00〜翌5:00)への対応
  • 送信ボタンや機能を時間外に止める(機能ゲート)
  • クライアント時刻は改ざんできるため、サーバー時刻で判定する方法
結論:判定の権威はサーバーに置き、フロントの時間帯判定はUX(無駄な操作を減らす)目的に留めます。クライアントで判定するなら必ず Asia/Tokyo に固定し、深夜をまたぐ範囲は OR で判定します。時間帯で表示を出し分けたいだけなら時間帯・曜日・期間で表示を切り替える完全ガイドが向いています。
スポンサーリンク

分単位で営業時間を判定する

時刻を「分単位の整数」に変換すると、09:30〜17:45 のような範囲も不等号だけで判定できます。

JavaScript:時間帯の判定
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 に固定した時刻を使います。

JavaScript:日本時間(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 で判定します。

JavaScript:深夜またぎ対応版
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時だけ機能を使える」ようにします。ここでは表示の切り替えではなく、ボタン(機能)の有効・無効を制御します。

JavaScript:平日の営業時間だけ送信ボタンを有効化
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(); // 時間外は押せない
「表示」を切り替えたいなら1455へ
チャットボタンやバナーを時間帯で表示・非表示したい場合は、挨拶・営業時間表示・リアルタイム更新までまとめた時間帯・曜日・期間で表示を切り替える完全ガイドが適しています。この記事は処理・機能の実行制御に焦点を当てています。

受付時間外は送信を止める

予約フォームなどで「受付時間外は送信させない」場合は、送信時に時刻をチェックします。

JavaScript:時間外は送信を中断
document.getElementById("reserve-form").addEventListener("submit", (e) => {
  if (!isWithinTimeRange("10:00", "16:00", nowInJst())) {
    e.preventDefault();
    alert("受付時間外のため送信できません(受付 10:00〜16:00)");
  }
});

連打や二重送信の防止と組み合わせると、より堅牢になります。送信ボタンの二重クリックを防止する方法ボタンの連打を防止する方法も合わせてご覧ください。

【重要】クライアントの時刻は信用できない

フロントの時間帯判定は回避できる
ここまでの判定はすべて閲覧者のPC時計に基づきます。ユーザーは時計を自由に変更でき、開発者ツールでJavaScriptの判定を書き換えることもできます。そのため、「受付時間外は本当に受け付けない」といった重要な制限は、必ずサーバー側でも判定してください。フロントの制御は「無駄な操作を減らす」UX目的と割り切ります。

厳密さが必要なら、サーバーから現在時刻を取得して判定します。これなら端末の時計やタイムゾーンに左右されません。

JavaScript:サーバー時刻で判定する
// サーバーが現在時刻(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)

QユーザーがPCの時計を変えても正しく制御できますか?
Aクライアント側の判定は時計の変更や開発者ツールで回避できます。「受付時間外は受け付けない」のような重要な制限はサーバー側でも必ず判定してください。フロントの判定は無駄な操作を減らすUX目的に留めるのが安全です。
Q海外からのアクセスでも日本時間で判定するには?
Anew Date().toLocaleString("en-US", { timeZone: "Asia/Tokyo" }) で日本時間に変換してから判定します。これで端末のタイムゾーンに関わらず、常に日本時間基準で営業時間を判定できます。
Q22時〜翌朝5時のような深夜をまたぐ時間帯は?
A開始が終了より大きい(日またぎ)場合は cur >= s || cur < eOR 判定にします。同じ日の中なら cur >= s && cur < eAND 判定です。
Q時間帯で表示そのものを切り替えたいだけです。
Aバナーやメッセージの表示・非表示、挨拶の出し分け、リアルタイム更新などは時間帯・曜日・期間で表示を切り替える完全ガイドにまとめています。この記事は処理や機能の実行制御が中心です。
Q営業時間を過ぎたら自動で切り替えたいです(ページを開いたまま)。
Aページを開いたままだと、読み込み時の判定のままになります。setInterval で定期的に再判定すると、営業終了時刻をまたいでも自動で切り替わります。詳しくはsetTimeout / setInterval の使い方を参照してください。

まとめ

  • 分単位判定:時刻を 時*60+分 の整数にして不等号で比較
  • タイムゾーン:営業時間判定は Asia/Tokyo に固定する
  • 深夜またぎ:開始>終了なら OR 判定
  • 機能ゲートdisabled や送信時チェックで時間外の操作を止める
  • クライアント時刻は改ざん可能:重要な制限はサーバー時刻・サーバー処理で判定
  • 表示の出し分けだけなら1455の完全ガイドへ

フロントは「先回りの案内」、サーバーが「最終判断」という二段構えにすれば、業務アプリや予約サイトでも安全に時間帯制御を実装できます。