首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >phpActiveRecord不正确DateTimeFormat

phpActiveRecord不正确DateTimeFormat
EN

Stack Overflow用户
提问于 2013-06-20 19:27:47
回答 3查看 2.4K关注 0票数 5

当试图使用phpActiveRecord在表中创建记录时,我得到以下错误:

Invalid datetime format: 1292 Incorrect datetime value: '2013-06-20 11:59:08 PDT' for column 'created_at'

正在运行的代码:

代码语言:javascript
复制
$new_cart = new QuoteRequest();
$new_cart->status = "cart";
$new_cart->save();

我已经追踪到phpActiveRecord中的相关行。文件Connection.php,第55-59行:

代码语言:javascript
复制
/**
 * Database's datetime format
 * @var string
 */
static $datetime_format = 'Y-m-d H:i:s T';

而使用此方法的行(Connection.php,第457-466行):

代码语言:javascript
复制
/**
 * Return a date time formatted into the database's datetime format.
 *
 * @param DateTime $datetime The DateTime object
 * @return string
 */
public function datetime_to_string($datetime)
{
  return $datetime->format(static::$datetime_format);
}

以及转换值的位置(Table.php第394-412行):

代码语言:javascript
复制
private function &process_data($hash)
{
    if (!$hash)
        return $hash;

    foreach ($hash as $name => &$value)
    {
        if ($value instanceof \DateTime)
        {
            if (isset($this->columns[$name]) && $this->columns[$name]->type == Column::DATE)
                $hash[$name] = $this->conn->date_to_string($value);
            else
                $hash[$name] = $this->conn->datetime_to_string($value);
        }
        else
            $hash[$name] = $value;
    }
    return $hash;
}

我使用的是MySQL版本5.6.10,created_at字段是时间戳。

问题:这里的phpActiveRecord有什么问题吗,还是MySQL问题?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-06-20 19:33:43

代码语言:javascript
复制
static $datetime_format = 'Y-m-d H:i:s T';

我认为您应该删除该'T' (它为您提供PDT,即时区缩写),因为它不是时间戳格式的一部分。

因此,应:

代码语言:javascript
复制
static $datetime_format = 'Y-m-d H:i:s';
票数 8
EN

Stack Overflow用户

发布于 2016-05-12 08:43:42

接受的答案有效;但是,您正在编写包的代码。这意味着,每当您在项目上更新PHP时,您将丢失该更改。

当在项目上设置AR时,更好的方法是在执行时重写它:

代码语言:javascript
复制
ActiveRecord\Config::initialize(function($cfg) {
  // [...] Your init config goes here
  ActiveRecord\Connection::$datetime_format = 'Y-m-d H:i:s';
});

您的init配置可能是稍有不同,所以一定要使它适应您的需要。

对项目进行重写,而不是更改供应商的核心文件:

  1. 是良好的实践;
  2. 让你的定制为任何在你的项目工作的人清楚;
  3. 如果您曾经在项目中更新PHP,则防止代码中断。
票数 4
EN

Stack Overflow用户

发布于 2014-02-26 03:50:03

问题的根本原因是您没有默认的时区设置。

您可能会在本地而不是服务器上看到这一点,因为服务器在配置中设置了时区。您可以在您的php配置中本地设置它,或者在您的源代码顶部设置超出ActiveRecord.php要求的位置,使用如下所示:

代码语言:javascript
复制
date_default_timezone_set('America/New_York');
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17222180

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档