【问题标题】:How to handle dates and times in MySQL and PHP?如何在 MySQL 和 PHP 中处理日期和时间?
【发布时间】:2013-08-29 08:52:19
【问题描述】:

我正在使用 CodeIgniter 2.1.x 和 MySQL。
我在使用 mysql 列类型 DATETIMETIMESTAMP 之间找到了很多建议,但我不确定哪个对我想要构建的内容真正正确。

我有一个应用程序,用户可以通过<form></form> 向谷歌地图添加标记。 每次标记提交后,mysql的date_createddate_end列应该记录一个当前时间,使用这个函数应该是+1天:

class Maps extends CI_Controller{
    ...
    public function marker($action = NULL, $slug = 'marker_add'){
        ...
        if($this->form_validation->run() == TRUE){
            $tomorrow = now() + 86400;
            $data_markers = array(
                'tid'           => $this->input->post('formMarkType'),
                'lat'           => $this->input->post('formMarkLat'),
                'lng'           => $this->input->post('formMarkLng'),
                'state'         => 1,
                'description'   => $this->input->post('formMarkDescription'),
                'date_end'      => $tomorrow
            );
            $this->map_model->markers_add($data_markers);
            redirect(site_url());
        }
        ...
    }

}

但是当我使用设置为TIMESTAMPDATETIME 的列类型时,它永远不会正确更新。

有什么建议我在这里做错了吗?

【问题讨论】:

标签: php mysql codeigniter-2


【解决方案1】:

这也取决于您是否关心时区。如果一个用户说在澳大利亚做了某事,而在美国的其他用户需要看到那件事,那么您需要将日期时间存储在用户各自时区的上下文中。

如果这对您来说不是问题,这将起作用。

$dt = new DateTime ('+1 day' , new DateTimeZone('Australia/Hobart')); 
$tomorrow = $dt->format('Y-m-d H:i:s');

只需使用离您的服务器最近的大陆/城市作为时区。

如果您有不同时区的用户。最好将 $datetime 保存在 'UTC' 时区(即 new DateTimeZone('UTC') 然后您可以在请求数据的用户的用户时区中呈现日期时间。

例如,

$dt = new DateTime('stored datetime', new DateTimeZone('UTC'));
$dt->setTimeZone(new DateTimeZone('users timezone'));

【讨论】:

    【解决方案2】:

    var 在插入前转储 $tomorrow。检查其格式,如果不是正确的加载日期助手并使用 mdate() http://ellislab.com/codeigniter/user-guide/helpers/date_helper.html

    【讨论】:

      【解决方案3】:

      如果 now() 函数存在于 CodeIgniter 上(它不存在于原生 PHP 上),然后检查它的输出是否符合以下格式:Y-m-d H:i:s,否则,这个问题可以帮助你:Inserting NOW() into Database with CodeIgniter's Active Record,另外,你可以用PHP standard date and time functions代替now()

      【讨论】:

      • 是的,它是 ci 提供的某种日期助手,在执行 now() 时,会输出 1377551478,我想以这种格式(时间戳)存储数据,但是,它只是不会的,我总是在markers.date_end -> 0000-00-00 00:00:00 中,即使列的类型设置为TIMESTAMP...?感谢您的链接,目前正在检查中
      • 顺便说一句,你提供的链接,我已经试过了,它现在可以工作了,我认为问题出在 MYSQL 处理的某个地方,因为它只是在按照另一篇文章中的建议进行操作时不会更新数据
      • 我想将此添加到您的答案中,请考虑更新您的帖子,以便我接受。我是用 MySQL 做的,而不是 PHP-way (stackoverflow.com/questions/3887509/mysqls-now-1-day)
      猜你喜欢
      • 1970-01-01
      • 2011-03-20
      • 1970-01-01
      • 1970-01-01
      • 2013-06-30
      • 1970-01-01
      • 2013-06-16
      • 2011-09-24
      • 1970-01-01
      相关资源
      最近更新 更多