CodeIgniter中多格式含额外字符串的日期转Y-m-d格式解决方案求助
解决CodeIgniter中多格式日期转MySQL Y-m-d的方案
嘿,我完全懂你这种头疼——面对一堆乱七八糟的日期格式,还要转成统一的MySQL格式存库,确实挺烦的。不过别担心,下面这套方案能覆盖你提到的所有场景,甚至能处理那些带前缀字符串的情况,在CodeIgniter里直接就能用:
核心思路
分三步处理:
- 先从带额外字符串的输入里提取纯日期部分(比如把
Start: April 1, 2017里的April 1, 2017抠出来) - 去掉日期里的序数词后缀(比如把
1st/2nd/3rd/4th变成纯数字1/2/3/4,让PHP能正确识别) - 用PHP的
DateTime类尝试多种可能的格式,直到匹配成功,再转成Y-m-d
具体实现(CodeIgniter辅助函数)
把下面的函数放到你的application/helpers/date_helper.php里(如果没有这个文件就新建一个):
function convert_to_mysql_date($input_date) { // 第一步:提取日期部分,处理带前缀的情况 // 正则匹配英文月份(全称/缩写)+ 数字 + 四位年份的组合 preg_match('/(Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\s+\d+(?:st|nd|rd|th)?[,.\s-]*\d{4}/i', $input_date, $matches); // 如果匹配到有效日期片段,就用这个片段;否则用原输入 $date_str = !empty($matches[0]) ? $matches[0] : $input_date; // 第二步:移除序数词后缀(st/nd/rd/th) $date_str = preg_replace('/(\d+)(st|nd|rd|th)/i', '$1', $date_str); // 第三步:定义所有需要兼容的日期格式,覆盖你提到的所有场景 $possible_formats = [ 'F j Y', // April 1 2017(去掉序数词后的格式) 'F j, Y', // April 1, 2017 'M-d-Y', // Jun-15-2015 / Apr-5-2017(缩写月份+横杠) 'd-F-Y', // 10-September-2015(数字日期+全称月份+横杠) 'M j Y', // Apr 1 2017(缩写月份+空格) 'M j, Y' // Apr 1, 2017(缩写月份+逗号) ]; // 循环尝试每个格式,直到找到能正确解析的 foreach ($possible_formats as $format) { $date = DateTime::createFromFormat($format, $date_str); // 双重验证:确保解析成功,且解析后的值和原字符串匹配(避免无效日期) if ($date && $date->format($format) === $date_str) { return $date->format('Y-m-d'); } } // 如果所有格式都匹配失败,可根据需求返回null、抛出错误或默认值 return null; }
怎么用?
在你的控制器或模型里,先加载这个helper:
$this->load->helper('date');
然后直接调用函数处理日期:
$input_date = "April 1st 2017"; $mysql_date = convert_to_mysql_date($input_date); // 输出:2017-04-01
测试覆盖你的所有场景
- 输入
April 1st 2017→ 输出2017-04-01 - 输入
May 29, 2015→ 输出2015-05-29 - 输入
Jun-15-2015→ 输出2015-06-15 - 输入
10-September-2015→ 输出2015-09-10 - 输入
Start: April 1, 2017→ 输出2017-04-01
扩展提示
如果之后遇到新的日期格式,只需要把对应的格式字符串添加到$possible_formats数组里就行,比如要兼容Y/m/d,就加个'Y/m/d'进去,非常灵活。
内容的提问来源于stack exchange,提问作者Agha




