PHP の time 関数と mktime 関数 - タイムスタンプを取得・生成する
PHP における日時処理の土台となるのが Unix タイムスタンプです。これは 1970 年 1 月 1 日 00:00:00 UTC からの経過秒数を整数で表したもので、date 関数をはじめとする多くの日時関数がこのタイムスタンプを内部的に利用しています。
time 関数で現在のタイムスタンプを取得する
time 関数は引数を取らず、現在の Unix タイムスタンプを整数で返します。
$now = time();
echo $now; // 例: 1750000000戻り値はただの整数なので、そのままでは人間が読める形式ではありません。表示用の文字列に変換するには date 関数と組み合わせます。
echo date('Y-m-d H:i:s', time());
// 例: 2025-06-15 14:30:00date 関数の第 2 引数を省略した場合も内部的に time() が呼ばれるため、上のコードは date('Y-m-d H:i:s') と同じ結果になります。明示的に time() を渡すか省略するかは好みの問題ですが、タイムスタンプを変数に保持して複数箇所で使い回す場合は、先に time() で取得しておくほうが一貫した時刻を扱えます。
mktime 関数で任意のタイムスタンプを生成する
mktime 関数は、時・分・秒・月・日・年を個別に指定して、その日時に対応するタイムスタンプを生成します。
mktime(
int $hour,
?int $minute = null,
?int $second = null,
?int $month = null,
?int $day = null,
?int $year = null
): int|false引数の順序が「時・分・秒・月・日・年」である点に注意してください。年月日ではなく時分秒が先に来るのは、他の言語に慣れていると間違えやすいポイントです。
$ts = mktime(0, 0, 0, 7, 20, 2025);
echo date('Y-m-d', $ts);
// 2025-07-20引数の省略と自動補完
mktime の引数は右側から省略できます。省略した引数には現在時刻の対応する値が自動的に使われます。
// 今日の15時0分0秒
$ts = mktime(15);
echo date('Y-m-d H:i:s', $ts);
// 例: 2025-06-15 15:00:00ただし、省略に頼りすぎるとコードの意図が不明瞭になりがちです。実務では必要な引数をすべて明示するほうが可読性の面で望ましいでしょう。
mktime の値の自動正規化
mktime には範囲外の値を自動的に正規化する機能があります。たとえば月に 13 を指定すると翌年の 1 月として計算されます。
// 2025年の13月1日 → 2026年1月1日
$ts = mktime(0, 0, 0, 13, 1, 2025);
echo date('Y-m-d', $ts);
// 2026-01-01
// 2025年1月0日 → 2024年12月31日
$ts = mktime(0, 0, 0, 1, 0, 2025);
echo date('Y-m-d', $ts);
// 2024-12-31この性質を利用すると、日付の加減算を簡潔に書けます。
mktime(0, 0, 0, day, $year) のように月に値を足すと、3 か月後のタイムスタンプが得られる。年をまたぐ場合も自動で繰り上がる。
mktime(0, 0, 0, year) のように翌月の 0 日を指定すると、当月の末日に正規化される。月の最終日を求めるテクニックとして広く知られている。
// 2025年2月の末日を求める
$ts = mktime(0, 0, 0, 3, 0, 2025);
echo date('Y-m-d', $ts);
// 2025-02-283 月の 0 日は「3 月 1 日の前日」として解釈されるため、2 月の末日が返ります。うるう年でも正しく 29 日が返るので、自前でうるう年判定を書く必要がありません。
time と mktime の使い分け
引数なしで現在のタイムスタンプを返す。「今この瞬間」の時刻を扱うときに使う。
時・分・秒・月・日・年を指定して任意のタイムスタンプを生成する。特定の日時を組み立てたいときに使う。
実際のアプリケーションでは、time で現在時刻を起点として取得し、mktime で「来月の 1 日」「今年の年末」などの特定の日時を組み立てるという組み合わせが頻繁に登場します。
gmmktime 関数
mktime はローカルタイムゾーンに基づいてタイムスタンプを計算しますが、UTC 基準で計算したい場合は gmmktime 関数を使います。
// ローカルタイムゾーン(例: Asia/Tokyo)で計算
$local = mktime(0, 0, 0, 1, 1, 2025);
// UTC で計算
$utc = gmmktime(0, 0, 0, 1, 1, 2025);
echo $local - $utc;
// 例: -32400(9時間 = 32400秒の差)サーバーのタイムゾーン設定が Asia/Tokyo であれば、同じ引数でも mktime と gmmktime の戻り値には 9 時間分(32,400 秒)の差が生じます。国際的なサービスで UTC 基準のタイムスタンプが必要な場合に gmmktime が役立ちます。