
php 升级后 `mktime()` 不再接受字符串参数,原代码将格式化时间字符串直接传入导致 typeerror;应改用 `strtotime()` 解析时间字符串,或用 `time()` 获取当前时间戳。
您遇到的错误源于 PHP 版本升级带来的严格类型检查增强(自 PHP 8.0 起,mktime() 等日期函数对参数类型校验更严格)。原始代码:
$ah = date("H:i:s Y-m-d");
$ahseg = mktime($ah);问题在于:$ah 是形如 "14:32:55 2024-06-15" 的字符串,而 mktime() 的第一个参数 $hour 必须是整数(int),不能是字符串——这在旧版 PHP(如 7.2)中可能被隐式转换并“侥幸”通过,但在新版(尤其是 PHP 8+)中会直接抛出 TypeError。
✅ 正确做法取决于您的实际需求:
-
若只需获取当前时间戳(最常见场景):
直接使用 time(),简洁高效:$ahseg = time(); // 返回当前 Unix 时间戳(int)
-
若需将自定义格式的时间字符串转为时间戳(如 "14:32:55 2024-06-15"):
使用 strtotime() —— 它专为解析人类可读时间字符串设计:$ah = date("H:i:s Y-m-d"); $ahseg = strtotime($ah); // ✅ 正确:返回对应时间戳(int) -
若需手动构造时间戳(如指定时分秒年月日):
mktime() 仍可用,但必须传入独立整数参数:立即学习“PHP免费学习笔记(深入)”;
$ahseg = mktime( (int)date('H'), // hour (int)date('i'), // minute (int)date('s'), // second (int)date('m'), // month (int)date('d'), // day (int)date('Y') // year );
⚠️ 注意事项:
- Plesk 默认启用较新 PHP 版本(如 8.1/8.2),务必检查服务器 PHP 版本:php -v;
- 避免依赖隐式类型转换,显式类型转换(如 (int))或选用语义明确的函数(strtotime, time, DateTimeImmutable::createFromFormat)更安全、可维护;
- 开发环境应与生产环境(Plesk 服务器)保持 PHP 版本一致,提前规避兼容性问题。
总结:mktime($string) 是典型误用。牢记口诀——字符串用 strtotime(),当前时间用 time(),精确控制用 mktime(小时, 分钟, 秒, 月, 日, 年)。











