You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:32:49