PHP strtotime() 支持豐富的英文相對時間描述,是日期運算的首選工具。配合 date() 格式化輸出,可輕鬆實現各類時間計算。
// 當前時間 + 間隔
date('Y-m-d H:i:s', strtotime('+1 month')); // 下個月同一時間
date('Y-m-d H:i:s', strtotime('+1 week')); // 下周同一時間
date('Y-m-d H:i:s', strtotime('+1 year')); // 下年同一時間
date('Y-m-d H:i:s', strtotime('+1 day')); // 明天同一時間
// 也支持複合表達
strtotime('+2 weeks 3 days 5 hours');
| 單位 | 英文關鍵字 | 示例 |
|---|---|---|
| 秒 | second / seconds / sec | +30 seconds |
| 分 | minute / minutes / min | +15 minutes |
| 時 | hour / hours | +3 hours |
| 天 | day / days | +7 days |
| 周 | week / weeks | +2 weeks |
| 月 | month / months | +1 month |
| 年 | year / years | +1 year |
| 工作日 | weekday / weekdays | +5 weekdays (跳過周末) |
| 特定星期幾 | monday / tuesday ... | next monday (下個周一) |
| 月初/月末 | first day of / last day of | first day of next month |
function getExpiryDate($startDate, $plan) {
$base = is_int($startDate) ? $startDate : strtotime($startDate);
switch ($plan) {
case 'monthly': $expr = '+1 month'; break;
case 'quarterly': $expr = '+3 months'; break;
case 'yearly': $expr = '+1 year'; break;
case 'weekly': $expr = '+1 week'; break;
default: throw new InvalidArgumentException('未知套餐');
}
return date('Y-m-d H:i:s', strtotime($expr, $base));
}
// 使用
echo getExpiryDate('2024-01-15', 'monthly'); // 2024-02-15 00:00:00
echo getExpiryDate(time(), 'yearly'); // 明年今日
// 日期字符串 -> 時間戳
$ts = strtotime('2024-12-31 23:59:59');
// 時間戳 -> 格式化日期
echo date('Y-m-d H:i:s', $ts);
// 獲取「下個月同一天」的時間戳 (一步到位)
$nextMonthTs = strtotime('+1 month', $ts);
strtotime('+1 month', strtotime('2024-01-31')) 返回 2024-03-03 (因 2 月無 31 號)。解決:用 'last day of +1 month' 固定取月末,或 'first day of +1 month' 取月初。date_default_timezone_set('Asia/Shanghai') 或 php.ini 設置正確,否則跨天計算可能偏移。DateTime 類比 strtotime 處理更精準。$dt = new DateTime('2024-01-31');
$dt->modify('+1 month'); // 2024-02-29 (閏年) 或 03-02
echo $dt->format('Y-m-d');
$dt = new DateTime(); // 當前時間
$dt->add(new DateInterval('P1M')); // +1 月
$dt->sub(new DateInterval('P7D')); // -7 天
echo $dt->format('Y-m-d H:i:s');
// 連續操作
echo (new DateTime('+1 week'))->format('Y-m-d');
DateInterval 格式遵循 ISO 8601:P (Period) + Y/M/D + T (Time) + H/M/S。