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

CodeIgniter 4中如何将MySQL时区设置为与PHP一致(IST)

解决CodeIgniter v4中updated_at字段时区不一致问题

问题根源

你手动设置的created_at和last_active_on依赖PHP的date()函数,由于PHP时区已设为IST,所以这两个字段时区正确;而updated_at是CodeIgniter自动维护的时间戳字段,它调用数据库的当前时间(如CURRENT_TIMESTAMP),若数据库时区仍为UTC,就会导致该字段与其他字段时区不一致。

正确解决方案(无需修改框架核心文件)

方案1:全局数据库连接时区配置(推荐)

在app/Config/Database.php中找到对应数据库的配置数组(如$default),添加初始化命令设置MySQL时区:

  • 若使用PDO驱动:
public $default = [
    'DSN'      => '',
    'hostname' => 'localhost',
    'username' => 'root',
    'password' => '',
    'database' => 'your_db',
    'DBDriver' => 'PDO',
    'DBPrefix' => '',
    'pConnect' => false,
    'DBDebug'  => (ENVIRONMENT !== 'production'),
    'cacheOn'  => false,
    'cacheDir' => '',
    'charset'  => 'utf8',
    'DBCollat' => 'utf8_general_ci',
    'swapPre'  => '',
    'encrypt'  => false,
    'compress' => false,
    'strictOn' => false,
    'failover' => [],
    'port'     => 3306,
    // 新增时区配置
    'options' => [
        PDO::MYSQL_ATTR_INIT_COMMAND => "SET time_zone='+05:30'"
    ]
];
  • 若使用MySQLi驱动:
public $default = [
    // 其他原有配置项...
    'initCommands' => [
        "SET time_zone='+05:30'"
    ]
];

方案2:仅在特定Model中设置时区

如果只想让Activity模型对应的数据库操作使用IST时区,可在自定义的Activity模型中添加构造函数:

<?php

namespace App\Models;

use CodeIgniter\Model;

class Activity extends Model
{
    protected $table = 'activity';
    protected $primaryKey = 'id';
    protected $useTimestamps = true;
    protected $createdField = 'created_at';
    protected $updatedField = 'updated_at';

    public function __construct()
    {
        parent::__construct();
        // 为当前模型的数据库连接设置IST时区
        $this->db->query("SET time_zone='+05:30'");
    }
}

验证说明

配置完成后重新执行更新操作,updated_at字段会自动使用IST时区,与其他字段保持一致。以上方式均不会修改框架核心文件,避免了框架更新时配置被覆盖的问题。

内容的提问来源于stack exchange,提问作者Alaksandar Jesus Gene

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 22:45:05