Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 当本地日期格式不同时处理mySQL日期格式_Php_Mysql_Codeigniter_Date - Fatal编程技术网

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

Php 当本地日期格式不同时处理mySQL日期格式,php,mysql,codeigniter,date,Php,Mysql,Codeigniter,Date,场景:我的PHP应用程序将始终使用日期字段DD-MM-YYYY。MySQL显然总是在YYYY-MM-DD中存储日期 免责声明:我知道如何手动更改日期格式-这不是问题所在 问题:什么是一种好的、干净的、优雅的方法,可以确保我的应用程序始终检索DD-MM-YYYY中的日期,而mySQL始终接收要存储的YYYY-MM-DD中的日期 i、 e.基本上,我希望在一个地方自动进行转换,而不必每次执行SQL查询时都调用它。这样,如果我“忘记”进行日期转换并不重要——每次都会发生 我想找个地方打电话 (编辑)我

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

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

问题:什么是一种好的、干净的、优雅的方法,可以确保我的应用程序始终检索DD-MM-YYYY中的日期,而mySQL始终接收要存储的YYYY-MM-DD中的日期

i、 e.基本上,我希望在一个地方自动进行转换,而不必每次执行SQL查询时都调用它。这样,如果我“忘记”进行日期转换并不重要——每次都会发生

我想找个地方打电话

(编辑)我的想法:我目前使用Codeigniter框架。我正在考虑使用我的\u模型,使用before\u get、before\u insert和before\u update回调。在这些回调中,我可以使用类似于以下内容的选项遍历所有字段:

// {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
}
并对更新/插入回调执行类似的操作。据我所知,数据库上没有额外的工作(因为Codeigniter在$query结果中提供信息)

想法


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

您可以使用strotime来确定所检查的值是否可由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)

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

我用的是杰米的“我的模型”——

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

    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循环。您可以将其设置为一个通用回调,循环检查每个变量是否为日期,但这似乎有很多开销。这样,您只需要为每个模型定义一次日期字段

使用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);

听起来像是一个查找第一个分隔符(“-”)的函数,如果输入是MySQL,则返回PHP格式,反之亦然。如果您记得在PHP和MySQL之间移动日期时在函数中包装所有日期,那么这可能会起作用。谢谢geoB-但是我可以把它放在哪里呢?i、 据我所知,mySQL没有回调。所以我需要一个函数,它会检查所有的值,看看是否是日期,然后测试是否需要转换…你是使用mysql_查询来收集数据,还是使用某种分层库,比如Zend_Db?我在想一个隐藏在include中的用户定义的实用程序函数。但是如果您正在寻找能够查看MySQL中的每个字段值和每个PHP变量的函数,我怀疑这样一个函数的开销是否值得。你将如何使用这个神奇的日期函数?我实际上使用的是Codeigniter-我将编辑上面的问题,以给你我当前的想法,使用
strotime
,这很神奇,但它会将AA/BB/CCCC解释为美国符号,而AA-BB-CCCC则解释为欧元符号(如将AA视为被划掉的月份,将AA视为被划掉的日子)。