PHP时区设置错误及代码致命错误求助
Hey,我来帮你解决这个折腾了你好几天的问题!咱们先拆解一下你遇到的几个错误,核心问题都出在第43行的代码逻辑和语法上:
1. 致命错误:Function name must be a string
你写的date.timezone($vote['callback_date'])是完全错误的用法——date.timezone是PHP的配置项(在php.ini里设置的),根本不是一个可调用的函数。你真正需要做的是把数据库里的callback_date字段转换成Unix时间戳,这时候应该用strtotime()函数。
2. 时区警告
虽然你代码里有date_default_timezone_set('GMT'),但它放在循环内部,而且GMT不是PHP推荐的标准时区标识符(更推荐用UTC或者具体时区比如Europe/London)。最好把时区设置放在PHP文件的最顶部,确保所有时间相关的函数都能使用正确的时区。
3. 未定义变量$time的提示
这个是连锁问题:因为第43行的语法错误导致代码执行失败,$time变量根本没被定义,所以后面计算$timeDiff的时候就会抛出这个Notice。
具体修复步骤
第一步:调整时区设置位置
把时区设置移到PHP文件的最开头,确保全局生效:
<?php // 先设置标准时区,这里用UTC示例,你可以换成自己需要的时区 date_default_timezone_set('UTC'); // 下面是你原来的代码 if ($_SERVER['REQUEST_METHOD'] != "POST" || !isset($_POST['url']) || $_POST['url'] != $_SERVER['HTTP_REFERER']) { exit; } include '../../constants.php'; include '../../classes/class.database.php'; // ... 剩下的原有代码 ...
第二步:修复第43行的时间计算逻辑
替换你原来的第43行代码,正确计算时间差:
// 替换原来的 $time = time(true) - date.timezone($vote['callback_date']); // 先把数据库中的回调日期转成时间戳 $callback_timestamp = strtotime($vote['callback_date']); // 计算当前时间与回调时间的差值 $time = time() - $callback_timestamp; $timeDiff = 43200 - $time;
额外兼容处理(可选)
如果你的callback_date存储的是非标准日期格式,strtotime()可能无法识别,这时候可以用DateTime类来更可靠地处理:
$callback_date = new DateTime($vote['callback_date']); $callback_timestamp = $callback_date->getTimestamp(); $time = time() - $callback_timestamp; $timeDiff = 43200 - $time;
永久解决时区警告(可选)
如果你不想在代码里每次设置时区,可以修改服务器的php.ini文件,添加或修改以下配置:
date.timezone = "UTC"
替换成你所在地区的标准时区标识符即可,这样所有PHP程序都会默认使用这个时区。
这样修改后,你遇到的所有错误应该都能解决了!
内容的提问来源于stack exchange,提问作者Josh Gates

