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

PHP7中从MySQL获取DATETIME时间并与当前时间对比的问题求助

问题分析与解决方案

我一眼就看到问题出在你处理查询结果的方式上,还有时间差计算的逻辑错误,咱们一步步来修正:

1. 核心错误:错误获取查询结果

mysqli_query() 返回的是结果集对象,不是直接的字段值。你直接把这个对象传给 strtotime(),它无法识别,所以返回了0(对应Unix纪元时间1970-01-01),这就是你看到旧时间显示为1970年的原因。

你需要先从结果集中取出实际的时间字符串:

// 执行查询后,获取行数据
$row = $savedTime->fetch_assoc();
// 取出last_updated_time字段的值
$savedTimeStr = $row['last_updated_time'];

2. 修正时间戳转换与时间差计算

之前的时间差计算用了 % 60,这只会得到秒数部分的差值(比如55秒),而不是总时间差。我们需要计算总秒数差,然后判断是否超过3600秒(1小时)。

另外,$currentTime 是字符串,不能直接和时间戳 $oldtime 比较,统一转成时间戳更可靠。

修正后的完整compareTime函数

function compareTime($countryCode){
    $conn = new mysqli(DBHOST, DBUSER, DBPASSWORD, DBNAME);
    // 检查连接
    if ($conn->connect_error) {
        die("Connection failed: " . $conn->connect_error);
    }
    $sql = "SELECT last_updated_time FROM my_table WHERE country_code = '$countryCode'";
    $result = mysqli_query($conn, $sql);
    
    if($result->num_rows == 0) {
        echo 'does not exist';
    } else {
        // 从结果集取出时间字符串
        $row = $result->fetch_assoc();
        $savedTimeStr = $row['last_updated_time'];
        
        date_default_timezone_set('Asia/Seoul');
        $currentTime = date("Y-m-d H:i:s");
        // 转换为时间戳
        $oldtime = strtotime($savedTimeStr);
        $currentTimestamp = strtotime($currentTime);
        
        // 计算总时间差(秒)
        $timeDiffInSec = $currentTimestamp - $oldtime;
        $formattedOldTime = date("Y-m-d H:i:s", $oldtime);
        
        echo '<p>Current Time: '.$currentTime.'</p>';
        echo '<p>Old Time: '.$formattedOldTime.'</p>';
        echo '<p>Time Difference (seconds): '.$timeDiffInSec.'</p>';
        
        // 判断是否超过1小时(3600秒)
        if ($timeDiffInSec > 3600) {
            echo '<p>超过1小时,执行更新操作</p>';
            // 这里写你的更新逻辑,比如:
            // $updateSql = "UPDATE my_table SET last_updated_time = '$currentTime' WHERE country_code = '$countryCode'";
            // mysqli_query($conn, $updateSql);
        } else {
            echo '<p>未超过1小时,直接使用现有数据</p>';
        }
    }
    $conn->close();
}
compareTime('us');

额外优化建议:防止SQL注入

你现在直接把 $countryCode 拼到SQL语句里,存在SQL注入风险。建议使用mysqli预处理语句:

// 替换原有的SQL执行部分
$stmt = $conn->prepare("SELECT last_updated_time FROM my_table WHERE country_code = ?");
$stmt->bind_param("s", $countryCode); // "s"表示字符串类型
$stmt->execute();
$result = $stmt->get_result();
// 后续的fetch操作和之前一样

这样即使$countryCode包含特殊字符,也不会破坏SQL语句,安全性更高。

关于时区的补充

因为你插入和取出时都设置了Asia/Seoul时区,所以时间戳转换是一致的,没问题。如果后续需要支持多时区,建议MySQL用TIMESTAMP类型(会自动转换为UTC存储,取出时转换为当前时区),或者存储UTC时间,在PHP中根据用户时区转换显示。

内容的提问来源于stack exchange,提问作者Kyle KIM

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:57:22