当本地日期格式不同时处理mySQL日期格式

时间:2012-05-04 03:02:14

标签: php mysql codeigniter date

场景:我的PHP应用程序将始终使用日期字段DD-MM-YYYY。 MySQL显然总是将日期存储在YYYY-MM-DD

免责声明:我知道如何手动更改日期格式 - 这不是问题

问题:确保我的应用 始终 在DD-MM-YYYY中重现日期的好,干净,优雅的方法是什么? ,mySQL 始终 收到YYYY-MM-DD中要存储的日期。

即。基本上我想在一个地方进行转换 自动 ,而不必每次进行SQL查询时都要调用它。这样,如果我“忘记”做一个date_conversion也没关系 - 它会一直发生在每一次......

我在考虑某种回调?

(编辑)我的想法:我目前使用的是Codeigniter框架。我正在考虑使用MY_Model,使用before_get,before_insert和before_update回调。在这些回调中,我可以使用类似的东西遍历所有字段以进行SELECT:

// {insert my query here to get records from DB. Then:
$query = $this->db->query();
$fields = $query->field_data(); 
foreach ($fields as $field)
{
      if ($field->type == 'date')
           // do conversion here
}

并为UPDATE / INSERT回调执行类似操作。据我所知,数据库上没有额外的工作(因为Codeigniter在$ query结果中提供信息)

思想?

编辑2:其他想法:只为每个模型执行此操作,并定义哪些字段是日期字段,并在每次回调时应用更改...是的...可能会这样做。 ..?

3 个答案:

答案 0 :(得分:1)

你可以使用strtotime来确定被检查的值是否可由php解析。如果是,那么你可以随意转换它

// {insert my query here to get records from DB. Then:
$query = $this->db->query();
$fields = $query->field_data(); 
foreach ($fields as $field)
{

    // strtotime returns false when provided an invalid value
    if ($timestamp = strtotime($field->value)) {
        $field->value = date('m-d-Y', $timestamp);
    }
}

// strtotime('Whatever content here') == bool(false)
// strtotime('2011-01-12') == int(1294808400)
// strtotime('January 12th, 2011') == int(1294808400)

答案 1 :(得分:1)

好的 - 回答我自己的问题 - 万一人们搜索并找到它:

我正在使用Jamie的“MY_Model” - https://github.com/jamierumbelow/codeigniter-base-model

在每个具有日期字段的模型上使用回调:

    class Fake_model extends MY_Model
    {
        public $before_create = array ('date_convert_to_mysql');
        public $before_update = array ('date_convert_to_mysql');
        public $after_get = array ('date_convert_to_php');

        function __construct()
        {
             parent::__construct();
        }


protected function date_convert_to_mysql($post)
{
    // Now convert the date field(s)
    $post['purchase_date'] = date("Y-m-d", strtotime($post['purchase_date']));
    return $post;        
}

    protected function date_convert_to_php($result)
{
    // Now convert the date field(s)
    $result['purchase_date'] = date("d-m-Y", strtotime($result['purchase_date']));
    return $result;        
}
}

如果选择或添加多个记录,则需要添加foreach循环。你可以把它作为一个通用的回调来循环每个变量,检查它是否是一个日期 - 但它似乎有很多开销。这样,您只需为每个模型定义一次日期字段

答案 2 :(得分:1)

使用PHP DateTime类:

// To Object, from input:
    $input_date_object = DateTime::createFromFormat('d-m-Y', $input_date);

// From Object, to MySQL:
    $mysql_date = $input_date_object->format('Y-m-d');

// ... Do a query using $mysql_date, returning, say, "due_date" field:

// To Object, from MySQL:
    $mysql_date_object = DateTime::createFromFormat('Y-m-d', $row['due_date']);

// From Object, to PHP/CodeIgniter friendly date:
    $php_date = $mysql_date_object->format('d-m-Y');

或者,稍微清洁的版本:

$php_format = 'd-m-Y';
$mysql_format = 'Y-m-d';

$input_date_object = DateTime::createFromFormat($php_format, $input_date);

$mysql_date = $input_date_object->format($mysql_format);

$mysql_date_object = DateTime::createFromFormat($mysql_format, $row['due_date']);

$php_date = $mysql_date_object->format($php_format);