[PHP]time関数で現在時刻のUnixタイムスタンプを取得する方法を徹底解説

PHP

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秒固定の加算ではなく DateTimemodify()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 クラスへとステップアップしていくイメージで覚えておくと整理しやすいです。

よくある落とし穴・注意点

  1. タイムゾーンと混同しやすい time() が返す値そのものにはタイムゾーンの概念がありません。あくまでUTC基準の「絶対的な秒数」です。表示時にタイムゾーンが反映されるのは date()DateTime 側の設定(date_default_timezone_set() など)によるものであり、time() 自体の挙動ではない点を理解しておきましょう。
  2. 2038年問題(Year 2038 problem) 多くの環境で time() の戻り値は32bit符号付き整数として扱われてきた歴史があり、2038年1月19日以降は表現できる範囲を超えてオーバーフローする可能性があります。現在の64bitシステム・PHP環境では多くの場合問題になりませんが、32bit環境やレガシーシステムと連携する場合は注意が必要です。
  3. 精度は秒単位までしかない ミリ秒やマイクロ秒単位での比較・計測が必要な処理(パフォーマンス測定など)に time() を使うと、短時間の処理では差が「0」になってしまい正しく計測できません。そのような場合は microtime(true) を使いましょう。
  4. タイムスタンプの加算で暦のずれを軽視しない 「1日 = 86400秒」として加算する方法は手軽ですが、夏時間の切り替えがあるタイムゾーンでは実際の暦日と1時間ずれることがあります。日付計算が重要な場合は DateTime::modify('+1 day') のような暦ベースの操作を検討してください。
  5. データベース保存時の型に注意 time() の戻り値をそのままデータベースのDATETIME型カラムに文字列として保存しようとすると、数値(タイムスタンプ)として保存されてしまい意図しない結果になることがあります。保存先のカラム型に応じて、date('Y-m-d H:i:s', time()) のように明示的に変換してから保存するのが安全です。

まとめ

ポイント内容
役割現在時刻のUnixタイムスタンプ(UTC基準の経過秒数)を取得する
引数なし
戻り値int型の整数
精度秒単位(ミリ秒以下が必要ならmicrotime()を使う)
よく組み合わせる関数date(), mktime(), strtotime()
主な用途ログ記録、キャッシュ期限管理、トークン発行、相対時間表示、日付計算
注意点タイムゾーン非依存・2038年問題・暦のずれ

time() は引数も戻り値もシンプルですが、それゆえにアプリケーションのあらゆる場所で使われる「時刻管理の土台」となる関数です。date()DateTime と組み合わせる前提で使いこなせるようになると、ログ、キャッシュ、認証トークンなど多くの実装がスムーズに書けるようになります。

タイトルとURLをコピーしました