Codeigniter时区mysql设置
Posted
技术标签:
【中文标题】Codeigniter时区mysql设置【英文标题】:Codeigniter timezone mysql settings 【发布时间】:2013-06-29 21:32:12 【问题描述】:刚刚意识到为什么我的网站现在将所有日期时间变量显示为 -1 小时...我第一次使用 Codeigniter! (以前没遇到过这个问题)
所以,我在我的主 index.php 文件中包含了以下代码
/*
|---------------------------------------------------------------
| DEFAULT TIMEZONE
|---------------------------------------------------------------
|
| Set the default timezone for date/time functions to use if
| none is set on the server.
|
*/
if( ! ini_get('date.timezone') )
date_default_timezone_set('GMT');
但是,它仍然显示为 -1 小时,所以我假设我需要为 mysql 设置某种默认设置...
我的模型中包含以下代码行:
function __construct()
// Call the Model constructor
parent::__construct();
$this->db->query("SET time_zone='+0:00'");
仍然没有区别...帮助!
我的代码是:
<h3><?=date('D, jS F @ g:ia', strtotime($row->datetime))?></h3>
$row->datetime 变量只不过是我的 MySQL 数据库中的 DATETIME 列值。视图中的回显变量总是比我数据库中的值少 1 小时...
我的型号代码是:
function coming_up()
$this->db->query("SET time_zone='+0:00'");
$query = $this->db->query('SELECT * FROM events1 WHERE datetime >= NOW() ORDER BY datetime LIMIT 2');
return $query->result();
【问题讨论】:
【参考方案1】:在 config/autoload.php 中,设置在每个页面加载时加载的模型。然后调用 $this->db->query("SET time_zone='+0:00'");在那个模型构造函数中。
config/autoload.php
$autoload['model'] = array('default_model');// for ex, "say default_model"
在应用程序/模型中,创建一个名为“default_model.php”的新模型文件并添加以下代码。
application/models/default_model.php
class Default_model extends CI_Model
function __construct()
// Call the Model constructor
parent::__construct();
$this->db->query("SET time_zone='+0:00'");
在每次页面加载时,将调用此构造函数,并将 mysql 时区设置为 +0:00。
【讨论】:
如果你需要处理夏令时,你可以加载命名区域$this->db->query("SET time_zone='America/Chicago'");
注意你需要设置mysql时区mysql_tzinfo_to_sql
在defined('BASEPATH') OR exit('No direct script access allowed.');
行下方的application/config/config.php 中添加类似date_default_timezone_set('TIMEZONE_SET_FOR_DATABASE');
的内容也是一个好主意
date_default_timezone_set 达到 php 级别。如果您的 db 和 php 文件位于同一服务器并且 mysql 使用相同的时区,那么您可以使用它但不确定 mysql 的行为。如果数据库在另一台服务器上,那么你必须按照我的解决方案。【参考方案2】:
在您的config file
中添加这些行,然后检查,它对我有用
$config['time_reference'] = 'gmt';# Default should be GMT
date_default_timezone_set('UTC');# Add this line after creating timezone to GMT for reflecting
【讨论】:
恐怕没有变化...@Rohan Kumar 检查您的insert query
,它应该看起来像$this->db->query("INSERT INTO TABLE SET time_zone='+0:00'");
见上文,我已经编辑了我的帖子以包含我的查询代码@Rohan Kumar 不过,没有区别!【参考方案3】:
我也面临这个问题。 我试过这种方式..
$this->db->query("SET LOCAL time_zone='Asia/Kolkata'");
$query="SELECT * FROM offers where NOW() between offfer_from and offer_to";
$res=$this->db->query($query);
它将在我的项目中正常工作,我没有使用任何新的默认模型。如果您想要全局解决方案,则意味着您可以使用自动加载某些模型。
【讨论】:
【参考方案4】:为 MySQL 设置默认时区: 转到:Your_Project/system/core/Model.php 然后更新这个函数:
public function __construct()
$this->db->query("SET time_zone='YOUR_TIME_ZONE'");
为 PHP 设置 default_time_zone : 转到 Your_Project/index.php 然后在这里更新:
define('ENVIRONMENT', isset($_SERVER['CI_ENV']) ? $_SERVER['CI_ENV'] : 'development');
date_default_timezone_set('YOUR_TIME_ZONE');
【讨论】:
【参考方案5】:我喜欢 Kumar 提出的解决方案,但我不需要在全局范围内设置它,只有在我的数据库中显示以 UTC 时间存储的日期时。
在我的 api 模型中,我有以下功能。
public function setDBTimeOffset()
$dt = new DateTime();
$offset = $dt->format("P");
$result = $this->db->query("SET time_zone='$offset';");
return $result;
# END FUNCTION setDBTimeOffset
从我的控制器中,我首先调用以下命令。
$this->api->setDBTimeOffset();
随后调用查询数据库的函数。例如,我正在获取一些用户历史记录。
$data["viewData"]["allHistory"] = $this->api->getUserHistory("ALL", 0, 10000);
当我显示输出时,日期在我的时区。我希望这对某个时间的某个人有所帮助(无法抗拒)。
【讨论】:
【参考方案6】:你可以在你的项目文件夹的 index.php 文件中设置它的顶部和<?php
之后
<?php
date_default_timezone_set('Asia/Bangkok');
【讨论】:
以上是关于Codeigniter时区mysql设置的主要内容,如果未能解决你的问题,请参考以下文章
codeigniter 4 设置会话变量 $session = \Config\Services::session();全球