首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP time() 與 mktime() 本質差異:一行代碼看懂「當下」與「構造」的分野

     編輯:PHP 綜合知識

核心結論先行

time() = 取得「現在」的 Unix 時間戳(唯讀、無參數)
mktime() = 根據指定日期時間「構造」一個 Unix 時間戳(可讀、可運算、多參數)

雖然 mktime() 省略所有參數時行為等同 time(),但兩者的語義邊界截然不同。

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
  • 無參數、無副作用
  • 返回自 1970-01-01 00:00:00 UTC 至今的秒數
  • 內部直接讀取系統調用 gettimeofday()

mktime():日期運算的核心引擎

<?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(視時區設定)
閏秒不感知不感知
可讀性需心算秒數參數即文檔
效能極快(單一系統調用)稍慢(參數解析、修正邏輯)

現代替代方案:DateTime 不可替代的優勢

<?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()。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved