【jQuery】指定した日時に要素を表示・非表示にする完全ガイド|期間限定コンテンツ・カウントダウン連動まで

セール告知バナーの期間表示・予約投稿コンテンツの公開・キャンペーン終了後の自動非表示——こうした「特定の日時に応じてコンテンツを切り替える」処理は、jQueryとJavaScriptのDate オブジェクトを組み合わせることで実現できます。

この記事でわかること

  • 指定した日時に達したかどうかを判定する方法
  • 開始〜終了の期間中だけ要素を表示する実装
  • setIntervalでリアルタイムに日時をチェックする方法
  • カウントダウンが0になったら自動でコンテンツを切り替えるパターン
  • 複数スケジュールを配列で管理する実装
  • タイムゾーンとサーバー時刻のズレへの対処法
スポンサーリンク

1. 指定した日時に達したかを判定する基本

JavaScriptの Date オブジェクトをミリ秒(UNIX時間)に変換して比較します。現在時刻 ≥ 指定日時なら表示、それ以外は非表示というロジックが基本形です。

$(function () {
  // 表示を開始する日時(例: 2025年8月1日 00:00:00)
  var showAt = new Date('2025-08-01T00:00:00');  // ISO 8601形式を推奨
  var now    = new Date();

  if (now >= showAt) {
    $('#campaign-banner').show();
  } else {
    $('#campaign-banner').hide();
  }
});
日時文字列のフォーマットに注意
new Date("2025/08/01 00:00:00") のスラッシュ区切りはブラウザによって動作が異なります。new Date("2025-08-01T00:00:00") のISO 8601形式(ハイフン+T区切り)が最も互換性が高く推奨です。タイムゾーンを明示したい場合は "2025-08-01T00:00:00+09:00"(JST)のように追記します。

2. 開始〜終了の期間中だけ表示する

セールや期間限定キャンペーンでは「開始日時より後かつ終了日時より前」の期間にだけコンテンツを表示します。

<div id="sale-banner" style="display:none;">
  <p>? 夏のセール開催中!全品20%オフ 〜8月31日まで</p>
</div>
<div id="ended-msg" style="display:none;">
  <p>セールは終了しました。またのご利用をお待ちしています。</p>
</div>
$(function () {
  var start = new Date('2025-08-01T00:00:00');  // 開始日時
  var end   = new Date('2025-08-31T23:59:59');  // 終了日時
  var now   = new Date();

  if (now < start) {
    // まだ開始していない
    console.log('セール開始前');

  } else if (now >= start && now <= end) {
    // 期間中
    $('#sale-banner').fadeIn(400);

  } else {
    // 終了済み
    $('#ended-msg').show();
  }
});
3段階で状態管理するのがポイント
「開始前・期間中・終了後」の3状態を明確に分けて処理することで、予告バナーや終了メッセージなど状態ごとに異なるコンテンツを表示できます。

3. setIntervalでリアルタイムにチェックする

ページ表示時の一回判定だけでなく、ページを開いたまま日時をまたぐ場合にはsetInterval() で定期的に判定し直す必要があります。

$(function () {
  var showAt  = new Date('2025-08-01T12:00:00');  // 公開日時
  var hideAt  = new Date('2025-08-31T23:59:59');  // 非表示日時

  function checkTime() {
    var now = new Date();

    if (now >= showAt && now <= hideAt) {
      if ($('#content').is(':hidden')) {
        $('#content').fadeIn(600);  // 初めて表示になるときのみアニメーション
      }
    } else {
      if ($('#content').is(':visible')) {
        $('#content').fadeOut(400);
      }
    }
  }

  checkTime();                          // 初回即時チェック
  setInterval(checkTime, 1000);         // 1秒ごとに再チェック
});
チェック間隔の選び方
秒単位の精度が必要なカウントダウン連動には 1000ms(1秒)、分単位の表示切り替えには 30000ms(30秒)程度でも十分です。必要以上に短い間隔は無駄なCPU負荷になるため用途に合わせて設定してください。

4. カウントダウン → 公開切り替えパターン

「あと○時間○分でセール開始」のカウントダウンを表示し、指定日時になったら自動でコンテンツを切り替える実装です。

<div id="countdown-area">
  <p>セール開始まで <span id="countdown">--:--:--</span></p>
</div>
<div id="sale-content" style="display:none;">
  <h2>? セール開始!今すぐチェック</h2>
</div>
$(function () {
  var target = new Date('2025-08-01T10:00:00');

  function pad(n) { return String(n).padStart(2, '0'); }  // 2桁ゼロ埋め

  function update() {
    var now  = new Date();
    var diff = target - now;  // ミリ秒の差

    if (diff <= 0) {
      // 日時を過ぎた → カウントダウン終了・コンテンツ表示
      clearInterval(timer);
      $('#countdown-area').fadeOut(400);
      $('#sale-content').fadeIn(600);
      return;
    }

    // 残り時間を計算
    var h = Math.floor(diff / 3600000);
    var m = Math.floor((diff % 3600000) / 60000);
    var s = Math.floor((diff % 60000) / 1000);

    $('#countdown').text(pad(h) + ':' + pad(m) + ':' + pad(s));
  }

  update();
  var timer = setInterval(update, 1000);
});

5. 複数スケジュールを配列で管理する

複数のバナーや告知を日時でスケジューリングする場合、配列に設定をまとめると管理が楽になります。

$(function () {
  // スケジュール設定(配列で一元管理)
  var schedules = [
    {
      id:    '#banner-summer',
      start: new Date('2025-07-01T00:00:00'),
      end:   new Date('2025-08-31T23:59:59')
    },
    {
      id:    '#banner-autumn',
      start: new Date('2025-09-01T00:00:00'),
      end:   new Date('2025-10-31T23:59:59')
    },
    {
      id:    '#banner-sale',
      start: new Date('2025-08-10T10:00:00'),
      end:   new Date('2025-08-12T23:59:59')
    }
  ];

  function applySchedules() {
    var now = new Date();
    $.each(schedules, function (i, s) {
      var $el = $(s.id);
      if (now >= s.start && now <= s.end) {
        $el.show();
      } else {
        $el.hide();
      }
    });
  }

  applySchedules();
  setInterval(applySchedules, 60000);  // 1分ごとにチェック
});
設定の外部化でメンテナンスが楽に
スケジュール設定を配列・オブジェクトで管理することで、日時の変更がコードの1か所で済みます。さらにAjaxでJSONを取得してスケジュールを動的に読み込めば、サーバー側からコンテンツ管理が可能になります。

6. 日付だけで判定する(時刻を問わない)

「〇月〇日から表示」という日付単位の判定では、時刻を00:00:00に統一するか、日付文字列を直接比較する方法が使えます。

$(function () {
  var now    = new Date();

  // 今日の日付を YYYY-MM-DD 形式で取得
  var todayStr = now.toISOString().slice(0, 10);  // 例: '2025-08-01'

  var startStr = '2025-08-01';
  var endStr   = '2025-08-31';

  // 文字列の辞書順比較(ISO形式なら日付の大小比較と一致する)
  if (todayStr >= startStr && todayStr <= endStr) {
    $('#summer-banner').show();
  }

  // 別の方法: 時刻を0時0分0秒にリセットして比較
  var today = new Date(now.getFullYear(), now.getMonth(), now.getDate());
  var start = new Date(2025, 7, 1);   // 月は0始まり(8月 = 7)
  var end   = new Date(2025, 7, 31);

  if (today >= start && today <= end) {
    $('#summer-banner').show();
  }
});
JavaScriptの月は0始まり
new Date(2025, 7, 1) は「2025年8月1日」です。new Date() のコンストラクタに数値を渡す場合、月は0始まり(1月=0、12月=11)になります。バグの多い箇所なのでISO文字列形式 new Date("2025-08-01") の方がミスが少なくなります。

7. タイムゾーンとサーバー時刻のズレへの対処

クライアントサイドのJavaScriptはユーザーの端末時計を参照します。ユーザーが端末の時計を意図的にずらしたり、海外ユーザーが異なるタイムゾーンで閲覧する場合に注意が必要です。

// タイムゾーンを明示して日時を定義(JST = UTC+9)
var startJST = new Date('2025-08-01T00:00:00+09:00');
var endJST   = new Date('2025-08-31T23:59:59+09:00');
var now      = new Date();  // ユーザー端末の現在時刻

// JavaScriptのDateはUTCで比較されるため、タイムゾーン付き文字列で定義すれば
// ユーザーのローカル時刻に関わらず正しく比較できる
if (now >= startJST && now <= endJST) {
  $('#sale-banner').show();
}

// ===== より厳密な実装: AjaxでサーバーのUTC時刻を取得して比較 =====
$.ajax({
  url: '/api/server-time',  // サーバー側でUTC時刻をJSONで返すエンドポイント
  success: function (data) {
    var serverTime = new Date(data.utc);  // 例: { utc: '2025-08-01T01:23:45Z' }
    var start = new Date('2025-08-01T00:00:00+09:00');
    var end   = new Date('2025-08-31T23:59:59+09:00');

    if (serverTime >= start && serverTime <= end) {
      $('#sale-banner').show();
    }
  }
});
方法 精度 コスト 向いている用途
クライアントの端末時刻 △(ユーザーが変更可能) ゼロ 一般的なコンテンツ表示
JST明示のISO文字列 ○(TZ差は自動補正) ゼロ 海外ユーザーがいる場合
Ajaxでサーバー時刻取得 ◎(端末操作を無効化) リクエスト1回 セール・投票締め切りなど重要な表示

まとめ

jQueryで日時に応じた表示切り替えを実装するポイントをまとめます。

やりたいこと 実装方法
特定日時以降に表示 now >= showAt で判定
期間中だけ表示 now >= start && now <= end
リアルタイム切り替え setInterval() で定期チェック
カウントダウン→公開 残りmsを計算し0以下で切り替え
複数スケジュール管理 配列に設定をまとめてeach()でループ
タイムゾーン対応 ISO文字列に+09:00を付ける

関連記事: jQueryでカウントダウンタイマーを実装する方法 / jQueryでランダムに要素を表示する完全ガイド(タイマー活用)

よくある質問(FAQ)

Qnew Date()に渡す日時文字列のフォーマットは?
A"2025-08-01T10:00:00" のISO 8601形式が最も互換性が高くおすすめです。"2025/08/01 10:00:00" のスラッシュ区切りはSafariなど一部のブラウザでNaNになることがあります。タイムゾーンを固定したい場合は "2025-08-01T10:00:00+09:00" のように追加します。
QJavaScriptの月が0始まりなのはなぜですか?
A歴史的な経緯でそのような仕様になっています。new Date(2025, 7, 1) は「2025年8月1日」です。この混乱を避けるため、数値を直接渡す方法よりも new Date("2025-08-01") のISO文字列を使うことを推奨します。
Qページを開いたまま日時をまたいだ場合、自動で切り替わりますか?
AsetInterval() で定期チェックを実装しない場合、ページ表示時の一回判定のみになります。ページを開いたまま日時をまたいで自動切り替えを行うには setInterval(checkTime, 1000) のような定期実行が必要です。
Qユーザーが端末の時計を変更して不正に表示させることはできますか?
AクライアントサイドのJavaScriptは端末の時計を参照するため、ユーザーが時計をずらせば回避できます。重要な表示制御(投票締め切り・限定価格など)はAjaxでサーバー時刻を取得するか、サーバーサイドでHTMLのレンダリングを制御することを推奨します。
Q海外ユーザーが閲覧すると表示のタイミングがずれますか?
Aタイムゾーンなしで new Date("2025-08-01T00:00:00") と書くと、ブラウザのローカルタイムゾーンで解釈されるため海外ユーザーと日本ユーザーで表示開始タイミングが異なります。"2025-08-01T00:00:00+09:00" のようにJSTを明示するとどの国のユーザーでも同一タイミングで表示されます。