我有一个CodeIgniter应用程序,其时区在config.php文件中设置为gmt。
$config['time_reference'] = 'gmt';
我注意到两件事:
请记住,我没有在任何模型中明确传递时间参考。我将表设置为在插入记录时自动插入TIMESTAMP。
答案 0 :(得分:1)
PHP和MySQL中的时区配置是两回事。当您在PHP中将其配置为GMT时,MySQL仍将其视为/etc/my.cnf
指令下default-time-zone='timezone'
文件中设置的时间戳。您可以使用以下查询检索当前的MySQL时区配置:
SELECT @@global.time_zone, @@session.time_zone;
这在很大程度上取决于实施。虽然你提到你没有传递任何时间参考,但我确信CodeIgniter会以某种方式为你做这件事。您应该显示一些代码,因为我怀疑CodeIgniter中存在这样的错误,因此您很可能设置错误。 更新由于时区差异,这很可能会受到影响。如果您将来尝试保存时间戳,则默认为0000-00-00 ...
答案 1 :(得分:1)
您需要更改字段格式或插入值。 你也可以找到一些方便的mysql函数 - 例如CURDATE()或NOW()
$sql = 'INSERT INTO tbl VALUES (NULL,:col1,:col2,,NOW())';
但我个人认为我会避免使用mysql时间戳。它们可能会意外更改,破坏您的所有数据。我会使用DATETIME并手动设置所有值。
答案 2 :(得分: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',你可以使用正则表达式以小时为单位获得偏移:
preg_match('/(.*)\:00/', '+2:00', $match)
将'+2'设置为$ match [1]
另一个:
首先,在配置文件中将主时间参考设置为“GMT”:
$config['time_reference'] = 'gmt';
在http://ellislab.com/codeigniter/user_guide/helpers/date_helper.html中选择时区参考,或使用timezone_menu()在下面的代码中为$ timezone设置变量或更新数据库列:
$time = now();
$timezone = 'UM5';
$daylight_saving = TRUE; // or FALSE
$local_time = unix_to_human(gmt_to_local($time, $timezone, $daylight_saving));
echo $local_time;