PHPでアプリケーションを作っていると、「今この瞬間」を数値として記録したい場面が必ず出てきます。ログの記録、キャッシュの有効期限管理、JWTトークンの発行時刻など、用途は数えきれません。そんなときに使うのが time() 関数です。
この記事では time() の基本仕様から、実践的な活用パターン、そして混同しやすい関連関数との違いまで、コード例を交えながら詳しく解説します。
関数概要
| 項目 | 内容 |
|---|---|
| 関数名 | time() |
| 読み方 | タイム |
| 分類 | 日付・時刻関数 |
| 対応バージョン | PHP 4以降(全バージョンで使用可能) |
| 引数 | なし |
| 戻り値 | 整数(int) |
| 名前空間 | グローバル関数 |
| 関連拡張モジュール | 標準で組み込み(拡張モジュール不要) |
構文
time(): int
time() は引数を一切取らない、非常にシンプルな関数です。呼び出すと、その瞬間の「Unixタイムスタンプ(Unixエポックタイム)」を整数値で返します。
Unixタイムスタンプとは、協定世界時(UTC)の 1970年1月1日 0時0分0秒 を起点(エポック)として、そこから経過した秒数のことです。タイムゾーンの概念を持たない、純粋な「秒数」であるという点が最大の特徴です。
基本的な使い方
<?php
$now = time();
echo $now . PHP_EOL;
実行結果(実行タイミングによって変わります):
1750000000
この数値だけ見ても何の時刻か直感的にはわかりませんが、date() 関数と組み合わせることで人間が読める形式に変換できます。
<?php
$now = time();
echo date('Y-m-d H:i:s', $now) . PHP_EOL;
実行結果:
2026-06-25 14:30:45
仕組みのイメージ図
1970-01-01 00:00:00 UTC(エポック)
│
│ ここから経過した「秒数」をカウント
│
▼
time() の戻り値
│
├─→ そのまま比較・演算(経過時間、期限判定など)
│
└─→ date() / DateTime に渡して人間向け表示に変換
time() が返すのはあくまで「数値」であり、表示形式は持っていません。表示が必要な場合は必ず date() や DateTime クラスとセットで使う、という構造を覚えておくとスムーズです。
実践的なコード例
例1:処理の実行時間を計測する
<?php
class ExecutionTimer
{
private int $startTime;
public function start(): void
{
$this->startTime = time();
echo "処理を開始しました: " . date('H:i:s', $this->startTime) . PHP_EOL;
}
public function stop(): void
{
$endTime = time();
$elapsed = $endTime - $this->startTime;
echo "処理が完了しました: " . date('H:i:s', $endTime) . PHP_EOL;
echo "経過時間: {$elapsed} 秒" . PHP_EOL;
}
}
$timer = new ExecutionTimer();
$timer->start();
sleep(3); // 重い処理の代わりに3秒待機
$timer->stop();
実行結果:
処理を開始しました: 14:30:00
処理が完了しました: 14:30:03
経過時間: 3 秒
補足:高精度な計測(マイクロ秒単位)が必要な場合は
microtime(true)を使いましょう。time()は秒単位の精度しかありません。
例2:キャッシュの有効期限を管理する
<?php
class SimpleCache
{
private array $store = [];
public function set(string $key, mixed $value, int $ttlSeconds): void
{
$this->store[$key] = [
'value' => $value,
'expires_at' => time() + $ttlSeconds,
];
}
public function get(string $key): mixed
{
if (!isset($this->store[$key])) {
return null;
}
if (time() > $this->store[$key]['expires_at']) {
echo "キー '{$key}' は期限切れのため削除します。" . PHP_EOL;
unset($this->store[$key]);
return null;
}
return $this->store[$key]['value'];
}
}
$cache = new SimpleCache();
$cache->set('user_profile', ['name' => '中島'], 5);
echo "即時取得: ";
var_dump($cache->get('user_profile'));
sleep(6);
echo "6秒後の取得: ";
var_dump($cache->get('user_profile'));
実行結果:
即時取得: array(1) {
["name"]=>
string(6) "中島"
}
6秒後の取得: キー 'user_profile' は期限切れのため削除します。
NULL
例3:投稿の「何分前」表示を作る
<?php
class RelativeTimeFormatter
{
public function format(int $timestamp): string
{
$diff = time() - $timestamp;
if ($diff < 60) {
return "{$diff}秒前";
}
if ($diff < 3600) {
return floor($diff / 60) . "分前";
}
if ($diff < 86400) {
return floor($diff / 3600) . "時間前";
}
return floor($diff / 86400) . "日前";
}
}
$formatter = new RelativeTimeFormatter();
$postedAt = time() - 125; // 125秒前に投稿されたと仮定
echo $formatter->format($postedAt) . PHP_EOL;
$postedAt2 = time() - 7300; // 約2時間前
echo $formatter->format($postedAt2) . PHP_EOL;
実行結果:
2分前
2時間前
SNSやブログでよく見る「3分前」「2時間前」といった表示は、まさにこの考え方で実装されています。
例4:ログに記録用のタイムスタンプを付与する
<?php
class Logger
{
private string $logFile;
public function __construct(string $logFile)
{
$this->logFile = $logFile;
}
public function write(string $message): void
{
$timestamp = time();
$line = sprintf(
"[%s] (unix:%d) %s%s",
date('Y-m-d H:i:s', $timestamp),
$timestamp,
$message,
PHP_EOL
);
file_put_contents($this->logFile, $line, FILE_APPEND);
echo $line;
}
}
$logger = new Logger('/tmp/app.log');
$logger->write('ユーザーがログインしました');
$logger->write('注文処理を開始しました');
実行結果:
[2026-06-25 14:30:00] (unix:1750000200) ユーザーがログインしました
[2026-06-25 14:30:01] (unix:1750000201) 注文処理を開始しました
ログに人間が読める日時とUnixタイムスタンプの両方を記録しておくと、後から他システムとの時刻照合や集計処理がしやすくなります。
例5:トークンの発行・期限切れ判定
<?php
class TokenIssuer
{
public function issue(string $userId, int $lifetimeSeconds = 3600): array
{
$issuedAt = time();
$expiresAt = $issuedAt + $lifetimeSeconds;
return [
'user_id' => $userId,
'token' => bin2hex(random_bytes(16)),
'issued_at' => $issuedAt,
'expires_at' => $expiresAt,
];
}
public function isExpired(array $token): bool
{
return time() >= $token['expires_at'];
}
}
$issuer = new TokenIssuer();
$token = $issuer->issue('user_001', 10); // 10秒だけ有効なトークン
echo "発行直後の状態: " . ($issuer->isExpired($token) ? '期限切れ' : '有効') . PHP_EOL;
sleep(11);
echo "11秒後の状態: " . ($issuer->isExpired($token) ? '期限切れ' : '有効') . PHP_EOL;
実行結果:
発行直後の状態: 有効
11秒後の状態: 期限切れ
APIトークンやワンタイムURLの有効期限管理は、time() の代表的な実用パターンの一つです。
例6:誕生日から現在までの年齢を計算する
<?php
class AgeCalculator
{
public function calculateFromTimestamp(int $birthTimestamp): int
{
$secondsPerYear = 365.25 * 24 * 60 * 60;
$diffSeconds = time() - $birthTimestamp;
return (int) floor($diffSeconds / $secondsPerYear);
}
}
$calculator = new AgeCalculator();
$birthTimestamp = mktime(0, 0, 0, 4, 15, 1990); // 1990年4月15日生まれ
echo "推定年齢: " . $calculator->calculateFromTimestamp($birthTimestamp) . "歳" . PHP_EOL;
実行結果(2026年6月時点での実行例):
推定年齢: 36歳
注意:うるう年や月の日数差を厳密に扱う必要がある場合は、この簡易計算ではなく
DateTime::diff()を使うほうが正確です。秒数ベースの近似計算は、日単位の誤差が出ることがあります。
例7:N日前・N日後の日付を計算する
<?php
class DateShifter
{
public function daysFromNow(int $days): int
{
return time() + ($days * 86400);
}
public function formatted(int $days): string
{
return date('Y-m-d', $this->daysFromNow($days));
}
}
$shifter = new DateShifter();
echo "今日: " . date('Y-m-d', time()) . PHP_EOL;
echo "7日後: " . $shifter->formatted(7) . PHP_EOL;
echo "30日前: " . $shifter->formatted(-30) . PHP_EOL;
実行結果:
今日: 2026-06-25
30日前: 2026-05-26
7日後: 2026-07-02
補足:日数計算で夏時間(DST)の影響を受けるタイムゾーンを扱う場合は、
86400秒固定の加算ではなくDateTimeのmodify()やDateIntervalを使うほうが安全です。time()ベースの単純な秒加算は、夏時間の切り替えがある地域では1時間ずれる可能性があります。
関連関数との比較
| 関数 | 戻り値 | 精度 | 主な用途 |
|---|---|---|---|
time() | int(Unixタイムスタンプ) | 秒単位 | 現在時刻を数値として取得 |
microtime() | float または string | マイクロ秒単位 | 処理時間の高精度な計測 |
date() | string | – | タイムスタンプを文字列に整形 |
mktime() | int(Unixタイムスタンプ) | 秒単位 | 任意の日時からタイムスタンプを生成 |
strtotime() | int(Unixタイムスタンプ) | 秒単位 | 自然言語的な日付文字列を解析して変換 |
new DateTime() | DateTimeオブジェクト | マイクロ秒対応 | オブジェクト指向での日時操作全般 |
hrtime() | int または array | ナノ秒単位 | システム時刻に依存しない相対時間計測 |
time() は「現在のUnixタイムスタンプを取得する」という一点に特化したシンプルな関数です。文字列整形が必要なら date()、特定の日時からタイムスタンプを作りたいなら mktime() や strtotime()、より高精度・高機能な操作が必要なら DateTime クラスへとステップアップしていくイメージで覚えておくと整理しやすいです。
よくある落とし穴・注意点
- タイムゾーンと混同しやすい
time()が返す値そのものにはタイムゾーンの概念がありません。あくまでUTC基準の「絶対的な秒数」です。表示時にタイムゾーンが反映されるのはdate()やDateTime側の設定(date_default_timezone_set()など)によるものであり、time()自体の挙動ではない点を理解しておきましょう。 - 2038年問題(Year 2038 problem) 多くの環境で
time()の戻り値は32bit符号付き整数として扱われてきた歴史があり、2038年1月19日以降は表現できる範囲を超えてオーバーフローする可能性があります。現在の64bitシステム・PHP環境では多くの場合問題になりませんが、32bit環境やレガシーシステムと連携する場合は注意が必要です。 - 精度は秒単位までしかない ミリ秒やマイクロ秒単位での比較・計測が必要な処理(パフォーマンス測定など)に
time()を使うと、短時間の処理では差が「0」になってしまい正しく計測できません。そのような場合はmicrotime(true)を使いましょう。 - タイムスタンプの加算で暦のずれを軽視しない 「1日 = 86400秒」として加算する方法は手軽ですが、夏時間の切り替えがあるタイムゾーンでは実際の暦日と1時間ずれることがあります。日付計算が重要な場合は
DateTime::modify('+1 day')のような暦ベースの操作を検討してください。 - データベース保存時の型に注意
time()の戻り値をそのままデータベースのDATETIME型カラムに文字列として保存しようとすると、数値(タイムスタンプ)として保存されてしまい意図しない結果になることがあります。保存先のカラム型に応じて、date('Y-m-d H:i:s', time())のように明示的に変換してから保存するのが安全です。
まとめ
| ポイント | 内容 |
|---|---|
| 役割 | 現在時刻のUnixタイムスタンプ(UTC基準の経過秒数)を取得する |
| 引数 | なし |
| 戻り値 | int型の整数 |
| 精度 | 秒単位(ミリ秒以下が必要ならmicrotime()を使う) |
| よく組み合わせる関数 | date(), mktime(), strtotime() |
| 主な用途 | ログ記録、キャッシュ期限管理、トークン発行、相対時間表示、日付計算 |
| 注意点 | タイムゾーン非依存・2038年問題・暦のずれ |
time() は引数も戻り値もシンプルですが、それゆえにアプリケーションのあらゆる場所で使われる「時刻管理の土台」となる関数です。date() や DateTime と組み合わせる前提で使いこなせるようになると、ログ、キャッシュ、認証トークンなど多くの実装がスムーズに書けるようになります。
