phpActiveRecord不正确的DateTimeFormat

时间:2013-06-20 19:27:47

标签: php mysql phpactiverecord

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

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

正在运行的代码:

$new_cart = new QuoteRequest();
$new_cart->status = "cart";
$new_cart->save();

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

/**
 * Database's datetime format
 * @var string
 */
static $datetime_format = 'Y-m-d H:i:s T';

使用它的行(Connection.php,第457-466行):

/**
 * 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行):

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问题?

3 个答案:

答案 0 :(得分:7)

static $datetime_format = 'Y-m-d H:i:s T';

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

应该这样:

static $datetime_format = 'Y-m-d H:i:s';

答案 1 :(得分:3)

接受的答案有效;但是你要写一下包的代码。这意味着每当您在项目中更新PHP-AR时,您将失去该更改。

更好的方法是在项目上设置AR时在执行时覆盖它:

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

您的初始配置可能differ a little,因此请务必根据您的需要进行调整。

在项目中覆盖而不是更改供应商的核心文件:

  1. 是好习惯;
  2. 为适合您项目的任何人明确自定义;
  3. 如果您在项目中更新了PHP-AR,请防止代码中断。

答案 2 :(得分:-1)

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

您可能会在本地而不是服务器上看到此信息,因为服务器在配置中设置了时区。您可以在php配置中本地设置此项,也可以在源代码顶部使用ActiveRecord.php进行设置,使用以下内容:

date_default_timezone_set('America/New_York');