1. PHPで「日付と時刻」を扱うための基本とは?
WEBサイトやアプリケーション開発において、「日付」や「時刻」を扱う場面は非常に多く登場します。例えば、ブログ記事の投稿日時、ニュースの新着表示、期間限定キャンペーンのカウントダウン、あるいは著作権表示(Copyright)の年号自動更新などです。
PHPは、こうした日時処理を得意とするプログラミング言語ですが、アプローチ方法が大きく分けて2つあります。
日付処理の2つのアプローチ
PHPで日時を扱う場合、主に以下の2通りの書き方があります。
- 関数ベース(手続き型):
date()やtime()などの関数を使う、古くからある書き方。シンプルで書きやすいですが、複雑な計算には向きません。 - オブジェクト指向型:
DateTimeクラスを使う、現在の主流な書き方。日付の計算やタイムゾーン(時差)の扱いが柔軟で、実務ではこちらが推奨される傾向にあります。
この記事では、手軽に使える関数ベースの方法と、より実践的な DateTime クラスの両方について、初心者の方にもわかりやすく解説していきます。
2.【実用】PHPで現在日時を取得・表示する方法を解説
まずは、基本中の基本である「今の時間」を取得して画面に表示する方法を見ていきましょう。
date() 関数を使った基本的な表示
もっとも簡単な方法は、date() 関数を使うことです。引数(ひきすう:関数に渡すデータ)に「どのような形式で表示したいか」を指定するだけです。
<?php
// 現在の日時を「年-月-日 時:分:秒」の形式で出力
echo date('Y-m-d H:i:s');
// 出力例:2023-10-05 14:30:00
?>
この1行だけで、アクセスした瞬間の日時が表示されます。
DateTime クラスを使ったモダンな記述
実務でよく使われる DateTime クラスを使うと、以下のように書きます。
<?php
// DateTimeクラスのインスタンス(実体)を作成
$now = new DateTime();
// formatメソッドを使って表示形式を指定
echo $now->format('Y-m-d H:i:s');
// 出力例:2023-10-05 14:30:00
?>
少し記述が長くなりますが、後述する「日付の計算」などを行う際に、この DateTime クラスの真価が発揮されます。まずは「new DateTime() で現在時刻が作れる」と覚えておきましょう。
3. 「タイムスタンプ」とは?日付と時刻を操作する仕組み
プログラミングで日時を扱う際、避けて通れないのが「UNIXタイムスタンプ」という概念です。
タイムスタンプの仕組み(UNIX時間)
私たち人間は「2023年10月5日」のように日時を認識しますが、コンピュータは「1970年1月1日 00:00:00(UTC)」からの経過秒数で時間を管理しています。この膨大な秒数のことを「UNIXタイムスタンプ」と呼びます。
例えば、「1696486200」といった数字がタイムスタンプです。
PHP内部ではこの数字を使って計算を行い、表示する直前に人間が読める形式(date関数など)に変換しています。
time() と strtotime() の使い方
タイムスタンプを扱う代表的な関数です。
time():現在のタイムスタンプ(秒数)を取得します。strtotime():文字(String)をタイムスタンプ(Time)に変換します。
<?php
// 現在のタイムスタンプを表示
echo time(); // 出力例:1696486200 (アクセスごとに変わります)
// 指定した日時のタイムスタンプを取得
echo strtotime('2024-01-01 00:00:00');
?>
「来週の日付」や「昨日の日付」を計算する際、このタイムスタンプの仕組みを理解していると非常にスムーズです。
4. 日時をフォーマット!思い通りの表示形式に整える方法
データベースには 2023-10-05 14:30:00 と保存されていても、画面には「2023年10月5日」と表示したい場合があります。これを「フォーマット(整形)」と呼びます。
よく使われるフォーマット指定子一覧
date() 関数や format() メソッドの中で使う、アルファベットの記号(フォーマット指定子)を組み合わせることで、自由に表示を変えられます。
| 記号 | 意味 | 出力例 |
|---|---|---|
| Y | 4桁の年 | 2023 |
| y | 2桁の年 | 23 |
| m | 月(先頭に0をつける) | 01, 10 |
| n | 月(先頭に0をつけない) | 1, 10 |
| d | 日(先頭に0をつける) | 05, 31 |
| j | 日(先頭に0をつけない) | 5, 31 |
| H | 時(24時間表記) | 09, 14 |
| i | 分 | 05, 59 |
| s | 秒 | 00, 59 |
| w | 曜日(数値 0=日〜6=土) | 0, 1… |
使用例:
<?php
$date = new DateTime('2023-10-05 14:30:00');
// 日本語形式に整形
echo $date->format('Y年n月j日 H時i分');
// 出力:2023年10月5日 14時30分
?>
【Tips】日本語の曜日を表示する工夫
PHPの標準機能だけでは、曜日が英語(Mondayなど)や数字で出力されてしまいます。日本語の「月曜日」などを表示するには、配列を使うのが一般的です。
<?php
$week = ['日', '月', '火', '水', '木', '金', '土'];
$date = new DateTime();
// 'w'を使って曜日番号(0〜6)を取得し、配列に対応させる
$w = $date->format('w');
echo $date->format('Y年m月d日') . '(' . $week[$w] . ')';
// 出力例:2023年10月05日(木)
?>
5. タイムゾーン(時差)の壁:国際的な時刻の扱い方
PHPプログラムをサーバーにアップロードした際、「時間が9時間ずれている」というトラブルに遭遇することがあります。これはタイムゾーン(Timezone)の設定が原因です。
日本時間(JST)と協定世界時(UTC)
サーバーの設定が世界標準時(UTC)になっていると、日本時間(JST)より9時間遅れて表示されます。日本向けのWEBサイトを作る場合は、明示的に「日本時間」を設定する必要があります。
タイムゾーンの設定方法
もっとも簡単な解決策は、PHPファイルの先頭で以下の設定を行うことです。
<?php
// タイムゾーンを東京(日本)に設定
date_default_timezone_set('Asia/Tokyo');
echo date('Y-m-d H:i:s');
// これで正しい日本時間が表示されます
?>
また、php.ini という設定ファイルを編集できる環境であれば、ファイル自体で設定を変更することで、毎回記述する必要がなくなります。
6. 日付の計算や比較をマスター!応用的な処理に挑戦
「3日後の日付を取得したい」「キャンペーン期間中かどうか判定したい」といった場合に必要な、計算と比較の方法を解説します。ここでは便利な DateTime クラスを活用します。
日数の加算・減算(「○日後」の計算)
modify() メソッドを使うと、直感的な言葉で日付を操作できます。
<?php
$date = new DateTime('2023-10-01');
// 1日足す(翌日)
$date->modify('+1 day');
echo $date->format('Y-m-d'); // 2023-10-02
// 1ヶ月引く(先月)
$date->modify('-1 month');
echo $date->format('Y-m-d'); // 2023-09-02
?>
2つの日付を比較する
DateTime オブジェクト同士は、普通の数字と同じように比較演算子(>, <など)を使って比較できます。
<?php
$today = new DateTime(); // 今
$target_day = new DateTime('2024-01-01'); // お正月
if ($today < $target_day) {
echo "お正月はまだ先です。";
} else {
echo "お正月を過ぎました!";
}
?>
このように、オブジェクト指向型のアプローチであれば、複雑な日付計算も非常にシンプルに記述できます。
7. 非推奨の関数に注意!安全な日付・時刻関数の選び方
最後に、古い記事や参考書を見る際の注意点です。PHPはバージョンアップに伴い、いくつかの関数が「非推奨(将来的に使えなくなる)」になっています。
PHP 8.1以降で非推奨となった strftime()
かつて日付のフォーマットによく使われていた strftime() という関数は、PHP 8.1以降で非推奨(Deprecated)となりました。もし古いコードで見かけた場合は、これまで解説した date() 関数や DateTime::format() を使う形に書き換える必要があります。
モダンな開発では DateTime クラスを推奨
これからPHPを学習する方は、基本的に DateTime クラス(および DateTimeImmutable クラス) を使う癖をつけることを強くおすすめします。推挙する理由としては主に以下の2点があります。
- 2038年問題の回避:古いシステムでは2038年以降の日付を正しく扱えない可能性がありますが、
DateTimeクラスは64bit環境であればこの問題に対応しています。 - 可読性の向上:コードが読みやすく、保守(メンテナンス)しやすくなります。
日付と時刻の操作は、WEB開発の基礎でありながら奥が深い分野です。まずは「取得・表示・計算」の基本パターンをしっかり押さえておきましょう。