期間限定ページに使える!PHPの「date関数」について

日付の処理に関するPHPの関数はいくつかありますが、比較的よく使われるのが、Unixタイムスタンプとフォーマットをもとに日付文字列を返す「date関数」です。

date関数を使うことで、日付で表示内容が変わるページを作れます。例えば、キャンペーンやイベントの告知ページなど。期間中は実施内容のみ掲載し、期間終了後は終了した旨も掲載する、ということが出来るようになります。

キャンペーンやイベントの告知ページは、期間終了後も検索エンジンに登録されたままになっていることがあるので、検索エンジン経由でアクセスした閲覧者に期間を勘違いさせてしまうことがままあります。

閲覧者に誤解させないページ作りにphpのdate関数が役に立つのです。

date関数実行前に必要なタイムゾーンの設定

date関数を使う上で必要な設定があります。

PHPでdate関数を使う前に「タイムゾーン(time zone)」と呼ばれる、エリアに関する設定を決めなければなりません。設定しなくても問題ない場合もあるのですが、エラーや想定外の動作をする原因になりますので、設定しておくのがおすすめです。

タイムゾーンとは、地域ごとの標準時間帯のことで、PHPではタイムスタンプを使った時間表示の時差を埋めるために重要な役割があります。タイムゾーンはdate_default_timezone_set関数を使って設定できます。

表記例


<?php
  date_default_timezone_set("Asia/Tokyo");
?>

上記の例は東京のタイムゾーンを設定するという意味です。"Asia/Tokyo"の箇所を書き換えることで、設定したいエリアに変更可能です。

東京以外のタイムゾーンについてはPHPの関数リファレンスで確認できます。

PHPで日付を表示する date関数の使い方

date関数は、フォーマットを元にタイムスタンプを日付文字列に変換する関数です。第一引数に日付のフォーマット、第二引数にタイムスタンプを指定します。

例:date関数の実行例


<?php 
    date("Y-m-d", 1503878400);
?>

実際に表示される内容

date関数 - 第一引数は「日付フォーマット」を指定する

date関数の第一引数は、日付のフォーマットを指定します。指定したフォーマット内の特定の文字が、日付・時刻情報に置き換えられます。上記例では"Y-m-d"というフォーマットでdate関数を実行しています。それぞれの文字は次のような意味があります。

例で使われているフォーマット文字の意味

文字 意味
Y 4ケタの西暦。
m 2ケタの月。0~9は先頭に0をつけて表示します。
d 2ケタの日。0~9は先頭に0をつけて表示します。

 

フォーマット内の特定の文字は『format パラメータ文字列』と呼ばれていて上記3つだけではありません。数が多いので、よく使われる文字を以下に挙げます。

【年】 を表す文字
パラメータ文字列 置き換えられる内容
Y 4ケタの数字。
y 2 ケタの数字。
【月】 を表す文字
パラメータ文字列 置き換えられる内容
m 2ケタの数字。0~9は先頭に0をつける。
n 数字。
【日】 を表す文字
パラメータ文字列 置き換えられる内容
d 数字。0~9は先頭に0をつける。
j 数字。
【曜日】 を表す文字
パラメータ文字列 置き換えられる内容
w 各曜日に対応する数字。
日…0、月…1、火…2、水…3、木…4、金…5、土…6
【時】 を表す文字
パラメータ文字列 置き換えられる内容
H 数字。24 時間単位。
h 数字。12 時間単位。
【分】 を表す文字
パラメータ文字列 置き換えられる内容
i 数字。0~9は先頭に0をつける。
【秒】 を表す文字
パラメータ文字列 置き換えられる内容
s 数字。0~9は先頭に0をつける。

PHPの関数リファレンスを参考に

頻出する文字は、date関数を使い続けるうちに覚えますので、その他文字に関しては、試験対策などでない限り、都度PHPの関数リファレンスを参照するのも良いと思います。

PHP: date – Manual

date関数 - 第二引数は「Unixタイムスタンプ」を指定する

date関数の第二引数は、日付/時刻を表すUnixタイムスタンプの数値を指定します。省略が可能で、その場合は実行時のUnixタイムスタンプが自動的に設定されます。正確には、time関数という現在のUnixタイムスタンプを返す関数が内部で実行され、その値が設定されています。

もしもPHPが32ビットで動作している場合、0~2147483647までの数値しか設定してはいけません。32ビットの最大値が2,147,483,647であるため、それより大きい数字は想定の時刻にならない仕様です。

2147483647という数値を日付/時刻に変換すると「2038年1月19日3時14分7秒」(※UTCの場合)になるため2038年問題と呼ばれていて、対策を行わないと多くのコンピュータで不具合が起こるのではないかといわれています。

 

date関数でアクセス時の日付/時刻を表示する。


ページにアクセスされた日付/時刻を表示したい場合は、第二引数を省略したdate関数の戻り値をそのまま出力するだけで問題ありません。。

例:アクセス時間を表示する


<?php 
    echo date("Y年m月d日 H時i分s秒") . "にアクセスしました。";
?>

現在時刻を表示するデモページ

date関数の曲者 - 曜日表示

date関数は、日本語の曜日を返すことが出来ないので、曜日を表示したい場合はひと手間必要です。

例:曜日を表示しようとした例


<?php 
    echo date("w", 1503187200) . "曜日です。";
    //出力 0曜日です。
?>

実際に表示される内容

2017年8月20日のタイムスタンプなので、「日曜日です」と表示されてほしいところですが、「0曜日です」と表示されてしまいました。日曜日なら0、月曜日なら1、と、曜日フォーマット文字を曜日に対応する数字と置き換えていることが理由です。

これに対応するため、もっとも手軽なのが、前もって配列変数に曜日の情報を代入しておき、date関数の戻り値で配列から取り出せるようにしておく方法です。

例:配列から曜日情報を取り出して表示する例


<?php
    $day = ["日","月","火","水","木","金","土"];
    echo $day[date("w", 1503187200)] . "曜日です。";
    //出力 日曜日です
?>

実際に表示される内容

日~土まで代入した配列変数$dayに、date関数で取得した曜日の数字でアクセスして日本語の曜日を取り出しています。

 

期間限定ページを作成する


ここまでdate関数の基本でした。ようやく本題です。
PHPは同じフォーマットで書かれた日付文字列の大小比較ができるので、上記date関数を使うと、簡単に日付を比較できるようになります。

第二引数を省略すると現在の時間を返してくれる仕様を使い、次のように処理を分岐させることで、表示内容を切り替えられます。

例:日付文字列の比較 – 2017年8月31日以前と以降で処理を分ける。


<?php 
    if( date("Y-m-d") >= "2017-08-31" ){
        echo "2017年8月31日以降です。";
    }else{
        echo "2017年8月30日以前です。";
    }
?>

 

注意! date関数で文字列比較する場合はフォーマットをそろえる

"同じフォーマットで書かれている"ということが肝要で、違っていると比較されない点にご注意ください。例えば、上記例の式が次の形だった場合、PHPを実行した日が、8月31日以降であっても、結果は「2017年8月30日以前です。」にしかなりません。

例:フォーマットが合致していない


<?php 
    if(date("Y-m-d") >= "2017-8-31"){ 
        echo "2017年8月31日以降です。";
    }else{
        echo "2017年8月30日以前です。";
    }
?>

date関数のformat パラメータ文字列の「m」は2ケタの数字なのですが、比較対象の値が1ケタで書かれていてフォーマットが一致しないため、比較できないのです。例の場合だと、「8」を「08」と書く必要があります。

まとめ

WordPressなどのCMSを使っていれば表示期間も簡単に変えられますが、CMSを使っていない方も少なくないと思います。その場合、PHPのdate関数を使い、次の注意点に気を付けるだけで、手間をかけず期間限定ページを作成可能です。

注意点まとめ

  • 日付文字列の比較を行う際はフォーマットをそろえること。
  • 32ビット環境の場合に、扱えるタイムスタンプに上限があること。

 

見た目もわかりやすく手軽に使えるので、作りきりのページを作成する際に重宝します。
PHPで日付表示をする際に、期間限定ページを作る際に使えるdate関数。どうぞお試しください!

すべての人にインターネット
関連サービス