CodeIgniter 3 中直接用 date() 格式化时间戳最简单也最易出错;CI4 必须用 CodeIgniter\I18n\Time 类,混用会报 TypeError 或静默失败。

CodeIgniter 3 项目里直接用 date() 格式化时间戳,是最简单也最容易出错的方式;CI4 则必须用 CodeIgniter\I18n\Time 类,混用会报错或静默失败。
CI3 中 time_to_seconds() 和 standard_date() 的典型误用
time_to_seconds() 只处理形如 '02:30:45' 的纯时间字符串,不是时间戳,也不校验格式——传 '1:5' 会被当 '01:05:00' 算出 3660,但不会警告。standard_date() 第二个参数必须是整型时间戳,传字符串(比如 '2023-04-01')会直接返回 false,而不是尝试解析。
- 用前先确认输入类型:
is_int($timestamp) && $timestamp > 0 - 别依赖
strtotime()包裹再传给standard_date(),CI3 的standard_date('DATE_RFC822', strtotime($str))是安全的,但standard_date('DATE_RFC822', $str)就不行 - 支持的常量只有那十几个(
DATE_ATOM、DATE_W3C等),不接受自定义格式字符串
CI3 自定义 format_date() 辅助函数怎么防空值和时区坑
很多人封装 format_date() 时直接套 date('Y-m-d', $ts),结果数据库字段为 NULL 或非法字符串时,PHP 报 Warning: date(): Invalid date format。CI3 没内置这个函数,自己写必须加防御。
- 开头强制判空:
if (empty($timestamp)) return '';或抛异常 - 优先用
DateTime::createFromFormat('Y-m-d H:i:s', $input)替代strtotime(),对格式敏感,避免'2023/04/01'和'2023-04-01'互相误判 - 时区别硬编码,读
date_default_timezone_get(),或允许传$timezone参数(如new DateTimeZone('Asia/Shanghai')) - 若用 CI 的
now(),它已适配$config['time_reference'],可直接喂给date()
CI4 的 Time 类不能和 date() 混用,尤其在 PHP 8.1+
CI4 已弃用 date_helper,改用 CodeIgniter\I18n\Time。但如果你在 CI3 项目升级 PHP 版本(尤其是 8.1+),旧代码里有 date('Y-m-d', new DateTime()) 这种写法,会直接触发 TypeError:PHP 不再隐式调用 ->getTimestamp()。
-
date('Y-m-d', $timeObj->getTimestamp())才合法 - CI4 推荐写法:
(new \CodeIgniter\I18n\Time($timestamp))->format('Y-m-d')或Time::parse($input)->format('Y-m-d') - 注意
Time::parse()对NULL输入返回null,需提前判断,否则->format()会 fatal error - CI4 的
Time默认用应用时区(app.timezone配置),不依赖date_default_timezone_set()
MySQL 查询中日期格式不匹配导致范围查不准
在 CI3 的模型里写 $this->db->where('created_at >=', date('m-d-Y', strtotime($start))),输出的是 '04-18-2026',MySQL 当字符串比,不是按日期比——可能漏掉数据,甚至拉回错误年份的记录。
- MySQL 只认
Y-m-d(即'2026-04-18')做可靠比较 - 正确写法:
date('Y-m-d', strtotime($start)),且确保$start是能被strtotime()解析的格式(如'04/18/2026'、'2026-04-18') - 更稳妥的是在 SQL 层用
STR_TO_DATE()或直接传时间戳,让 MySQL 转:$this->db->where('created_at >=', "STR_TO_DATE('$start', '%m/%d/%Y')") - 如果字段是
DATETIME,建议统一用时间戳传参,避免格式歧义
最易忽略的一点:CI3 项目升级 PHP 8.1+ 前,得扫全站所有 date() 调用点,确认传入值类型——DateTime 对象、NULL、非法字符串,都可能在新版里直接崩,而不是只 warn。

















