Php MySQL时间戳仅在RDS中存储为0000-00-00:00:00?

Php MySQL时间戳仅在RDS中存储为0000-00-00:00:00?,php,mysql,codeigniter,amazon-rds,Php,Mysql,Codeigniter,Amazon Rds,我有一个CodeIgniter应用程序,在config.php文件中时区设置为gmt $config['time_reference'] = 'gmt'; 我注意到两件事: 我的本地数据库在数据库中设置时间戳,但不设置为GMT,即使我已显式设置它。为什么呢 我的生产Amazon RDS数据库将所有时间戳设置为0000-00-00:00:00。为什么呢 请记住,我没有在任何模型中显式传递时间引用。我将表设置为在插入记录时自动插入时间戳 PHP和MySQL中的时区配置是两件不同的事情。虽然在PHP

我有一个CodeIgniter应用程序,在config.php文件中时区设置为gmt

$config['time_reference'] = 'gmt';
我注意到两件事:

  • 我的本地数据库在数据库中设置时间戳,但不设置为GMT,即使我已显式设置它。为什么呢
  • 我的生产Amazon RDS数据库将所有时间戳设置为0000-00-00:00:00。为什么呢
  • 请记住,我没有在任何模型中显式传递时间引用。我将表设置为在插入记录时自动插入时间戳

  • PHP和MySQL中的时区配置是两件不同的事情。虽然在PHP中将其配置为GMT,但MySQL仍然将其视为
    default timezone='timezone'
    指令下
    /etc/my.cnf
    文件中设置的时间戳。您可以通过以下查询检索当前MySQL时区配置:

    SELECT @@global.time_zone, @@session.time_zone;
    
  • 这在很大程度上取决于实施情况。虽然您提到您不会传递任何时间引用,但我相信CodeIgniter会以某种方式为您传递时间引用。您应该显示一些代码,因为我怀疑CodeIgniter中是否存在类似的错误,所以您很可能设置了错误更新这很可能是由于时区差异造成的。如果您试图在将来保存时间戳,它将默认为0000-00-00


  • 您需要更改字段格式或插入值。 您还可以找到一些mysql函数,例如CURDATE()或NOW()

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

    但就个人而言,我会避免使用mysql时间戳。它们可能会意外更改,破坏您的所有数据。我会使用DATETIME并手动设置所有值。

    在事件表单中,您应该向服务器发送一个包含客户端时区偏移的隐藏输入。您可以通过Javascript的Date.getTimezoneOffset()方法获得它(它以分钟为单位提供UTC和用户本地时间之间的偏移量)

    如果您不能这样做,您可以将用户的本地时区保存到db中,或者在事件表单中询问它

    然后,在插入或更新查询中,可以使用DATE_ADD('2012-12-13 19:41:00',[user offset]MINUTE)转换时间戳。您也可以在php中完成,或者在提交表单时在客户端完成

    例如,在PHP中:

    strtotime($event_date);
    
    提供日期的Unix时间戳(以秒为单位)。要将其转换为另一个时区,根据javascript方法以分钟为单位获得的偏移量,可以执行以下操作:

    $dbTimestamp = strtotime($event_date) + $_POST['offsetInMinutes']/60;
    
    如果以以下形式获取偏移量:“+2:00”或“-6:00”,则可以使用正则表达式以小时为单位获取偏移量:

    preg_match('/(.*)\:00/', '+2:00', $match)
    
    将“+2”设置为$match[1]

    另一个:

    首先,在配置文件中将主时间引用设置为“GMT”:

    $config['time_reference'] = 'gmt';
    
    在中选择“从时区引用”,或使用timezone_menu()在下面的代码中为$timezone设置变量或更新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;
    

    好的,我在本地机器和RDS上运行了您的查询。我的本地机器同时返回SYSTEM,RDS同时返回UTC(这是我想要的)。这至少解释了我的本地机器问题,但为什么RDS将其作为0插入数据库中?当您提供无效的时间戳时,会插入0。我猜您正在尝试添加时间戳,数据库认为它是在未来(由于时区差异),因此它写入0。当时间戳无效时,它总是写入0。我实际上没有在模型中手动传递任何时间戳。我将表设置为在插入新记录时将时间戳插入created_on列。我的生产服务器使用的是PST,但我需要UTC,因此将来不能使用。如果在INSERT上使用当前的时间戳,但它无法工作,那么这显然是DBA的问题,我将查找有关DBA SE的信息。你有什么发现。我只是注意到只有我的本地数据库将其设置为当前时间戳,但我的RDS数据库没有该属性。即使在RDS上,我也运行相同的迁移来创建表。不知道为什么它没有设置那个属性。您建议我编写另一个迁移来设置它吗?您建议我编辑所有模型以手动插入日期吗?只需在代码中放置now()/CURDATE()函数!这就行了!测试之前!不要在生产上做无赖!kkkso不是在这里解决真正的问题,我们只是重写软件来引入新的不同问题?这可能是真的问题!是他觉得更方便的!这可能不是最好的方法!我没有真正存储用户的时区,我也不需要它。我的服务器返回它的本地timezine,它基本上需要转换为UTC。CodeIgniter在进行数据库插入时是否使用$config['time_zone']引用?我的数据库已设置为UTC。