2014-04-01 52 views
0

我有一个CodeIgniter应用程序,它的时区在config.php文件中设置为gmt。MySQL TIMESTAMP仅在RDS中存储为0000-00-00 00:00:00?

$config['time_reference'] = 'gmt'; 

我注意到两两件事:

  1. 我的本地数据库设置一个TIMESTAMP在数据库中而不是GMT即使我已经明确地设置它。这是为什么?
  2. 我的生产Amazon RDS数据库将所有TIMESTAMPS设置为0000-00-00 00:00:00。这是为什么?

请记住,我没有明确地在我的任何模型中传递时间参考。我将表设置为在插入记录时自动插入TIMESTAMP。

回答

1
  1. PHP和MySQL中的时区配置是两回事。虽然您将其配置为PHP中的GMT,但MySQL仍将其视为/etc/my.cnf文件中default-time-zone='timezone'指令中设置的时间戳。您可以使用此查询检索当前的MySQL时区配置:

    SELECT @@global.time_zone, @@session.time_zone; 
    
  2. 这太依赖于实现。虽然你提到你不通过任何时间引用,但我确信CodeIgniter会以这种或那种方式为你做到这一点。你应该显示一些代码,因为我怀疑在CodeIgniter中有这样的错误,所以你很可能会设置错误。 更新由于时区差异,这很可能会发生。如果您尝试在将来保存时间戳,它将默认为0000-00-00 ...

+0

OK,我跑您在我的本地机器和RDS上的查询。我的本地机器都返回SYSTEM,RDS返回UTC(这是我想要的)。这至少解释了我的本地机器问题,但是,为什么RDS将它作为​​0插入到数据库中? – Nag

+0

当您提供无效的时间戳时,插入0。我猜想你正在尝试添加时间戳,哪个数据库认为是未来(由于时区差异),因此它写入0.它始终在时间戳无效时写入0。 – phoops

+0

我实际上并没有在模型中手动传递任何时间戳。我有表设置,以便插入新记录时插入TIMESTAMP到created_on列中。我的生产服务器在PST,但我希望UTC,所以它不能在未来。 – Nag

1

您需要更改字段格式或插入值。 您也可以找到一些MySQL的功能,方便的 - 例如

$sql = 'INSERT INTO tbl VALUES (NULL,:col1,:col2,,NOW())'; 

CURDATE()或NOW(),但我个人会避免MySQL时间戳。他们可以意外地改变,破坏你的所有数据。我会使用DATETIME并手动设置所有值。

+0

您是否建议我编辑我的所有模型以手动插入日期? – Nag

+0

只需在你的代码中放置now()/ CURDATE()函数!这将做到这一点!测试前!不要在生产上做流氓! kkk –

+0

所以不是在这里解决真正的问题,我们只是重写软件来引入新的不同问题? – phoops

0

在您的活动表单中,您应该向服务器发送一个隐藏的输入信息,其中包含客户端的时区偏移量。你可以通过Javascript的Date.getTimezoneOffset()方法得到它(它给你UTC和用户本地时间之间的分钟偏移量)。

如果您不能这样做,您可以将用户的本地时区保存到数据库中,或者在您的事件表单中提问。

然后,在您的INSERT或UPDATE查询中,您可以使用DATE_ADD('2012-12-13 19:41:00',[用户偏移量] MINUTE)转换时间戳。你也可以做到这一点在PHP中,或客户端提交表单时...

例如在PHP中:

strtotime($event_date); 

为您提供了日期的Unix时间戳(所以,单位为秒)。把它转换成另一个时区,根据你在使用JavaScript方法偏离的分钟数,你可以这样做:

$dbTimestamp = strtotime($event_date) + $_POST['offsetInMinutes']/60; 

如果你得到抵消这种形式:“+2:00”或“-6:00 +2 '到$匹配[1]

还有一句:

首先,设置你的主人时的参考:”

preg_match('/(.*)\:00/', '+2:00', $match) 

将设置,你可以在小时使用正则表达式偏移'到'GMT'在你身上[R配置文件:在http://ellislab.com/codeigniter/user_guide/helpers/date_helper.html

$config['time_reference'] = 'gmt'; 

选择时区参考或使用timezone_menu()设置一个变量或在下面的代码更新$时区一个DB列:

$time = now(); 
$timezone = 'UM5'; 
$daylight_saving = TRUE; // or FALSE 
$local_time = unix_to_human(gmt_to_local($time, $timezone, $daylight_saving)); 
echo $local_time; 
+0

我不是真的存储用户的时区,我也不需要它。我的服务器返回它的本地时间表,基本上需要转换为UTC。在进行数据库插入时,CodeIgniter会执行$ config ['time_zone']参考吗?我的数据库已经设置为UTC。 – Nag