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() メソッドの中で使う、アルファベットの記号(フォーマット指定子)を組み合わせることで、自由に表示を変えられます。

記号意味出力例
Y4桁の年2023
y2桁の年23
m月(先頭に0をつける)01, 10
n月(先頭に0をつけない)1, 10
d日(先頭に0をつける)05, 31
j日(先頭に0をつけない)5, 31
H時(24時間表記)09, 14
i05, 59
s00, 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開発の基礎でありながら奥が深い分野です。まずは「取得・表示・計算」の基本パターンをしっかり押さえておきましょう。