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

Posted

技术标签:

【中文标题】本地日期格式不同时处理 mySQL 日期格式【英文标题】:Handling mySQL date formats when local date format is different 【发布时间】:2012-05-13 14:27:30 【问题描述】:

场景:我的 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: 其他想法:只需为每个模型执行此操作,并定义哪些字段是日期字段,然后在每个回调中应用更改...是的...可能会这样做。 ..?

【问题讨论】:

听起来像是一个寻找第一个分隔符 ('-') 并在输入是 MySQL 时返回 PHP 格式的函数,反之亦然。如果您记得在 PHP 和 MySQL 之间的日期移动时将所有日期包装在函数中,可能会起作用。 感谢 geoB - 但我可以把它放在哪里?即据我所知,mySQL 没有回调。所以我需要一个函数,它会检查所有值,看看它是否是一个日期,然后测试是否需要转换...... 您是在使用 mysql_query 来收集数据,还是在使用诸如 Zend_Db 之类的分层库? 我在想一个隐藏在包含中的用户定义的实用函数。但是,如果您正在寻找可以查看 MySQL 中的每个字段值和每个 PHP 变量的东西,我怀疑这样一个函数的开销是否值得付出努力。你会如何使用这个神奇的日期功能? 我实际上在使用 Codeigniter - 我将在上面编辑我的问题,给你我目前的想法 【参考方案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)

【讨论】:

【参考方案2】:

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

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

【讨论】:

小心strtotime,这很神奇,但它会将AA/BB/CCCC解释为美国符号,而将AA-BB-CCCC解释为欧洲符号(例如,在斜线时将AA视为月份,AA视为破折号的日期)。【参考方案3】:

使用 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 日期格式的主要内容,如果未能解决你的问题,请参考以下文章

Mysql日期处理

mysql 时间转换 用EXCEL实现MySQL时间戳格式和日期格互转

java导入excel时处理日期格式(已验证ok)

更改 Pandas 中特定单元格的日期格式

MySQL 日期格式

如何使用POI处理Excel中的日期数据类型