在PHP 中,處理日期和時間是日常開發中非常常見的任務之一。其中, date_sub是一個非常實用的函數,可以讓我們輕鬆地從一個DateTime對像中減去指定的時間間隔。本教程將詳細介紹如何使用date_sub函數來從當前日期中減去特定的時間,比如天、月、年、小時等。
date_sub是一個內置函數,它接收兩個參數:
一個DateTime對象。
一個DateInterval對象。
函數的作用是從DateTime對像中減去由DateInterval定義的時間間隔,並返回新的DateTime對象。
函數原型:
DateTime date_sub ( DateTime $object , DateInterval $interval )
注意:從PHP 8.0.0 開始, date_sub()已被標記為已廢棄,推薦使用DateTime::sub()方法來實現相同功能。
首先,我們需要創建一個表示當前時間的DateTime對象。
$date = new DateTime(); // 當前日期時間
然後,創建一個時間間隔對象。比如我們想減去10 天:
$interval = new DateInterval('P10D'); // P 表示週期,D 表示天
DateInterval的格式是ISO 8601 風格,例如:
'P2Y' :2 年
'P3M' :3 個月
'P15D' :15 天
'PT5H' :5 小時
'PT30M' :30 分鐘
推薦使用DateTime的sub()方法進行減法操作:
$date->sub($interval);
我們可以使用format()方法來輸出最終的時間:
echo $date->format('Y-m-d H:i:s');
<?php
// 當前日期和時間
$date = new DateTime();
// 創建一個時間間隔,例如減去 10 天
$interval = new DateInterval('P10D');
// 從日期中減去這個間隔
$date->sub($interval);
// 輸出結果
echo "10 天前的日期是:" . $date->format('Y-m-d H:i:s');
?>
比如你的網站需要展示一篇文章發布日期的前一周:
$publishDate = new DateTime('2025-05-28');
$interval = new DateInterval('P7D');
$publishDate->sub($interval);
echo $publishDate->format('Y-m-d');
$registerDate = new DateTime();
$interval = new DateInterval('P7D');
$expireDate = clone $registerDate;
$expireDate->add($interval); // 設置失效時間為註冊時間 +7天
echo "請在 " . $expireDate->format('Y-m-d H:i:s') . " 前激活賬戶。";
$now = new DateTime();
$interval = new DateInterval('P1M');
$lastMonth = clone $now;
$lastMonth->sub($interval);
// 比如你有一個訪問統計頁面
$url = "https://gitbox.net/logs/view?start=" . $lastMonth->format('Y-m-d') . "&end=" . $now->format('Y-m-d');
echo "查看過去一個月的訪問日誌:<a href='$url'>$url</a>";
時間格式錯誤: DateInterval的格式必須嚴格遵守ISO 8601 規範,不能亂寫。
對象引用問題:直接修改原始DateTime對象會影響後續邏輯,必要時使用clone 。
時區問題:默認時區不一致可能導致時間偏差,建議手動設置時區:
date_default_timezone_set('Asia/Shanghai');
通過DateTime和DateInterval的組合,PHP 為開發者提供了非常靈活的時間計算能力。 date_sub()或DateTime::sub()方法的使用相對簡單,但功能強大,可以滿足絕大多數的日期減法需求。在日常開發中,如果涉及時間範圍的判斷、統計、記錄等功能,掌握這一函數的使用將非常有幫助。