mktime() 在 php 8.3 中已被标记为废弃,不推荐新项目使用;它根据本地时区的年月日时分秒返回 unix 时间戳,但不支持时区切换和夏令时,建议改用 datetime 类替代。

在 PHP 8.3 中,mktime() 函数依然可用,但官方已明确标记为“废弃(deprecated)”,不推荐在新项目中使用。它仍能创建时间戳,但未来版本可能移除。
mktime() 的作用是根据你提供的年、月、日、时、分、秒,返回对应本地时区的 Unix 时间戳(即从 1970-01-01 00:00:00 UTC 起的秒数)。
注意:它基于服务器本地时区,不是 UTC;且不处理时区切换、夏令时等复杂逻辑。
mktime() 基本用法
$timestamp = mktime($hour, $minute, $second, $month, $day, $year);
所有参数都可选,未传入则使用当前时间对应值。例如:
// 创建 2025-03-15 14:30:45 的时间戳(本地时区) $ts = mktime(14, 30, 45, 3, 15, 2025); // 只指定年月日,时分秒自动用当前值 $ts = mktime(0, 0, 0, 12, 25, 2024); // 2024-12-25 00:00:00(本地时间)
- 月份是 1–12(不是 0–11)
- 日期超出范围会自动进位/借位(如
mktime(0,0,0,13,1,2024)→ 2025-01-01)
更推荐的替代方案:DateTime 类
PHP 5.2+ 起就建议用 DateTime,它更清晰、支持时区、可读性强、不易出错:
// 创建本地时间
$dt = new DateTime('2025-03-15 14:30:45');
$timestamp = $dt->getTimestamp();
// 指定时区(比如 UTC)
$dt = new DateTime('2025-03-15 14:30:45', new DateTimeZone('UTC'));
$timestamp = $dt->getTimestamp();
// 或用 createFromFormat 精确解析
$dt = DateTime::createFromFormat('Y-m-d H:i:s', '2025-03-15 14:30:45');
if ($dt) {
$timestamp = $dt->getTimestamp();
}
优势:
- 明确区分输入格式与时区含义
- 支持 ISO 8601 字符串(如
'2025-03-15T14:30:45+08:00') - 可链式调用、易调试、兼容性好
如果必须用 mktime(),要注意这些坑
- 不要依赖默认参数来“取今天零点”,因为
mktime(0,0,0)是当前小时的 0 分 0 秒,不是当天 00:00:00 - 月份和日期为 0 或负数时会回滚(如
mktime(0,0,0,0,1,2025)→ 2024-12-01),逻辑难预测 - 无法显式指定时区,容易在多时区部署时出错
- PHP 8.3 的弃用警告会在 error_log 或开发环境报
Deprecated: mktime(): Passing null to parameter ... is deprecated(如果你传了null或未初始化变量)
小结:该怎么做
- ✅ 新代码统一用
new DateTime(...)->getTimestamp() - ✅ 需要 UTC 时间时,显式传入
new DateTimeZone('UTC') - ⚠️ 维护旧代码若还在用
mktime(),至少确保参数非 null、范围合理,并计划逐步替换 - ❌ 不要用
mktime()处理跨时区、历史时区变更(如 1970 年前或夏令时切换日)场景
不复杂但容易忽略:时间戳本身是 UTC 秒数,但 mktime() 的输入是本地时间解释的——这个隐含假设,常是 bug 根源。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











