CodeIgniter中date()返回1970年因未校准时间戳且忽略时区配置;须用strtotime()或DateTime转字符串为时间戳,或使用已适配时区的now()函数,并注意PHP 8.1+需显式调用getTimestamp()。

date() 函数在 CodeIgniter 中为什么总返回 1970 年?
因为 date() 是 PHP 原生函数,不认 CodeIgniter 的时区配置;直接传入未校准的时间戳(比如从数据库读的 created_at 字符串),它会当成 UTC 零点处理,本地时区偏移没生效,结果就掉回 Unix 起始时间。
- 务必先用
strtotime()或DateTime把字符串转成时间戳,再喂给date() - 若用 CodeIgniter 的
now()辅助函数,它已自动适配$config['time_reference'],可直接传给date() - 检查
application/config/config.php中的$config['time_reference']是否设为'local'(默认是'UTC')
format_date() 这类自定义辅助函数该怎么写才不踩坑?
CodeIgniter 没内置 format_date(),很多人自己封装时直接套 date(),却忘了处理空值、非法格式、时区混用——结果测试环境 OK,上线后数据库字段为 NULL 就报 Warning: date(): Invalid date format。
- 函数开头必须加
if (empty($timestamp)) return '';或抛出明确提示 - 推荐用
DateTime::createFromFormat()替代strtotime(),对格式敏感但更可控(比如'Y-m-d H:i:s'和'Y/m/d'不会互相误判) - 别在函数里硬编码时区,优先读
date_default_timezone_get(),或允许传$timezone参数
load_helper('date') 后的 time_to_seconds() 和 standard_date() 实际怎么用?
time_to_seconds() 只接受形如 '02:30:45' 的字符串,不是时间戳;standard_date() 的第二个参数必须是时间戳,传字符串会静默失败,返回 false。
-
time_to_seconds('1:5')→3660(注意它不校验格式,'1:5'会被当'01:05:00') -
standard_date('DATE_RFC822', strtotime('2023-04-01'))→ 正确;standard_date('DATE_RFC822', '2023-04-01')→ 返回false -
standard_date()支持的常量只有那十几个(如DATE_ATOM、DATE_W3C),不支持自定义格式字符串
PHP 8.1+ 下 date_helper 和 DateTime 对象混用的兼容性问题
CodeIgniter 3.x 的 date_helper 完全基于函数式调用,而 PHP 8.1 开始对 date() 的 int|false 返回类型更严格;若你把 DateTime 对象直接传给 date(),会触发 TypeError,而不是旧版的隐式转换。
- 不要写
date('Y-m-d', new DateTime())—— 必须显式调用->getTimestamp() - CodeIgniter 4 已弃用
date_helper,改用CodeIgniter\I18n\Time,但 CI3 项目升级 PHP 版本前,得逐个扫date()调用点 - 第三方库(如 Carbon)和
date_helper别混用同一时间逻辑,容易因时区对象状态不一致导致偏移叠加










