ある一定の期間中だけ、何かを表示させたいということは、よくあります。
例えば……
- キャンペーンを表示したい
- お知らせを表示したい
- バナーを表示したい
- 緊急の案内を表示したい
- タイムセールを表示したい
特に今の時期だと、年末年始の休業表示を一定期間中だけ自動で表示したいという要望は毎年あります。
中には手動でやっている方もいらっしゃるかもしれませんね。
しかし、私のようなフリーランスの場合、表示するのを忘れてしまったら信用を失います。ですので「絶対に忘れてはならない」という心理的負担が生じるのです。また、そもそも夜間早朝の場合は無理ですよね。。
なのでそういった期間に定めのある表示は自動化しましょう!ということで、今回は、バニラPHPと、Laravelで実現する方法についてご紹介します。
前提
タイムゾーンが狂っていると、時間の判定がずれてしまいます。以下の様に表示して、意図した時間が表示されているかを確認しましょう。
echo date('Y-m-d H:i:s');
意図したタイムゾーンになっていない場合、例えば日本時間に設定する場合は以下をコード中に埋め込みます。
// 日本時間 (JST) に設定
date_default_timezone_set('Asia/Tokyo');
他にも、php.ini
や.htaccess
等で設定もできますが、大抵はすでに合っていると思いますので省略します。
バニラPHP
まずはバニラPHP、つまり素のPHP単体の機能で実現する方法です。後述しますが、外部ライブラリを使っても良いです。
日時を指定する
標準で利用できるDateTimeのコンストラクタに、Y-m-d H:i:sの形式で開始日、終了日を指定します。
<?php
$start = new DateTime('2024-12-30 00:00:00'); // 開始日時
$end = new DateTime('2025-01-06 08:00:00'); // 終了日時
$now = new DateTime(); // 現在日時
?>
<?php if ($now >= $start && $now <= $end): ?>
<div>
<p>年末年始は12月30日から、1月5日までお休みします。</p>
</div>
<?php endif; ?>
秒単位まで指定できますが、指定が無い場合は上記のように0で埋めておくと間違いありません。
Laravel
日時を指定する
Laravelは日時操作を簡単にするためのライブラリであるCarbonが標準で使えるので、とても簡単に実装できます。
@php
$start = \Carbon\Carbon::create(2024, 12, 30, 0); // 開始日時
$end = \Carbon\Carbon::create(2025, 1, 6, 8); // 終了日時
$now = \Carbon\Carbon::now(); // 現在日時
@endphp
@if ($now->between($start, $end))
<div>
<p>年末年始は12月30日から、1月5日までお休みします。</p>
</div>
@endif
とても直感的ですね。
create
メソッドは、省略することも、より詳細に秒数まで指定することも可能です。
// 2025年1月6日
$date = \Carbon\Carbon::create(2025, 1, 6);
// 2025年1月6日9時5分30秒・タイムゾーンはUTC
$date = \Carbon\Carbon::create(2025, 1, 6, 9, 5, 30, 'UTC');
もちろん、バニラPHPでもCarbonをComposerでインストールして使えます。
おまけ:自分のIPだけ除外する
ごくまれに、動作確認として自分だけ本番環境でお知らせを表示させたいということもあります。というか実際、最近あったので共有します。
Laravelの場合、request()->ip()
でIPを取得できますので、自分のIPだけ除外します。また$start
を過去にすることで今すぐ動作確認できます。
@php
$start = \Carbon\Carbon::create(1024, 12, 30, 0); // 開始日時
$end = \Carbon\Carbon::create(2025, 1, 6, 8); // 終了日時
$now = \Carbon\Carbon::now(); // 現在日時
$excludedIp = '123.456.789.000'; // 除外するIP
$currentIp = request()->ip(); // 現在のユーザーのIP
@endphp
@if ($now->between($start, $end) && $currentIp !== $excludedIp)
<div>
<p>年末年始は12月30日から、1月5日までお休みします。</p>
</div>
@endif
参考までに、バニラPHPでは$_SERVER['REMOTE_ADDR']
を使いますが、それだけでは取得できないこともあります。
まとめ
年末年始などの長期休暇や、キャンペーンなどでは、できるだけ手動ではなく、自動で表示させたいものですね。
一度何かで書いておけば、あとはコピペで流用できますので便利です。
ただ、設定自体に誤りがあると当然意図しない動作になり、信用を失います。実際にご利用される際は、あらかじめよく確認・検証してくださいね。
もし「この記事のコード自体に誤りがあるかもしれないな」……と自然と思ったら、それはエンジニアとして良い考えです。
コメント