time() = 取得「現在」的 Unix 時間戳(唯讀、無參數)
mktime() = 根據指定日期時間「構造」一個 Unix 時間戳(可讀、可運算、多參數)
雖然 mktime() 省略所有參數時行為等同 time(),但兩者的語義邊界截然不同。
<?php
// 唯一用法
$requestTime = time(); // 1716187200
$requestTime = $_SERVER['REQUEST_TIME']; // PHP 5.1+ 更高效,避免函數調用開銷
// 典型應用:計算一週後
$nextWeek = time() + 7 * 24 * 60 * 60;
echo date('Y-m-d', $nextWeek); // 2024-05-27
gettimeofday()<?php
// 完整簽名(is_dst 自 PHP 5.1 棄用,7.0 移除)
mktime(int $hour, int $minute, int $second, int $month, int $day, int $year): int|false
// 核心特性:自動修正越界值
echo date('Y-m-d', mktime(0,0,0, 2, 30, 2023)); // 2023-03-02(2月無30日,自動進位)
echo date('Y-m-d', mktime(0,0,0, 13, 1, 2023)); // 2024-01-01(月份13自動進位到次年)
// 參數從右至左可選,預設為「當前 GMT 時間」對應分量
mktime(12, 0, 0); // 今天 12:00:00
mktime(0, 0, 0, 7); // 今年 7 月 1 日 00:00:00
| 維度 | time() + 運算 | mktime() 組裝 |
|---|---|---|
| 語義 | 「當下往前推 86400 秒」 | 「構造明天 00:00:00」 |
| 夏令時 | 可能跨越 DST 邊界導致偏差 | 自動處理 DST(視時區設定) |
| 閏秒 | 不感知 | 不感知 |
| 可讀性 | 需心算秒數 | 參數即文檔 |
| 效能 | 極快(單一系統調用) | 稍慢(參數解析、修正邏輯) |
<?php
// 推薦寫法:清晰、可鏈式、時區安全
$tomorrow = (new DateTime())->modify('+1 day')->setTime(0,0,0)->getTimestamp();
// 或
$dt = new DateTime('tomorrow 00:00:00', new DateTimeZone('Asia/Taipei'));
$ts = $dt->getTimestamp();
遷移建議:新專案全面採用 DateTime/DateTimeImmutable;僅在維護舊代碼、極簡腳本、或效能極度敏感的熱路徑中保留 time()/mktime()。