2013-06-20 19 views
4

当试图创建一个使用phpActiveRecord我碰到下面的错误在表中的记录:phpActiveRecord不正确的DateTimeFormat

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); 
} 

而且其中该值被转换(表.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问题?

回答

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

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

应该是这样的:

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

我试过了,它的工作原理;但是相同的代码正在运行在活动服务器上,这是令人困惑的。 – silasjmatson

+0

你确定吗?尝试在将值插入到实时服务器之前将其值var_dump。 – silkfire

+0

我会检查在服务器上。 – silasjmatson

-1

问题的根本原因是,你没有一个默认的时区设置。

您可能会在本地而不是服务器上看到此消息,因为服务器在配置中设置了时区。你可以在你的PHP配置或在源代码上面使用类似ActiveRecord.php的要求顶部设置这个本地:

date_default_timezone_set('America/New_York'); 
+1

不正确。如果使用上述函数设置时区,则此问题仍然存在 – JosFabre

2

接受的答案工程;但是你正在编写包的代码。这意味着,无论何时您更新项目中的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,请防止代码中断。
+0

此添加会导致以下错误:访问未声明的静态属性:ActiveRecord \ Connection :: $ datetime_format – JosFabre