You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

CodeIgniter中多格式含额外字符串的日期转Y-m-d格式解决方案求助

解决CodeIgniter中多格式日期转MySQL Y-m-d的方案

嘿,我完全懂你这种头疼——面对一堆乱七八糟的日期格式,还要转成统一的MySQL格式存库,确实挺烦的。不过别担心,下面这套方案能覆盖你提到的所有场景,甚至能处理那些带前缀字符串的情况,在CodeIgniter里直接就能用:

核心思路

分三步处理:

  1. 先从带额外字符串的输入里提取纯日期部分(比如把Start: April 1, 2017里的April 1, 2017抠出来)
  2. 去掉日期里的序数词后缀(比如把1st/2nd/3rd/4th变成纯数字1/2/3/4,让PHP能正确识别)
  3. 用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

火山引擎 最新活动