date() 返回1970年是因为传入了非法时间戳(如字符串、NULL、负数或秒级未转毫秒),导致回退至Unix纪元;须先用is_numeric()校验并确保为非负整数,或用strtotime()/DateTime::createFromFormat()正确转换。

date() 为什么总返回 1970 年?
因为 date() 是 PHP 原生函数,完全不读取 CodeIgniter 的时区配置(比如 $config['time_reference'])。当你直接传一个数据库里查出来的 '2023-04-01 10:30:00' 字符串给它,date() 会当成 UTC 零点处理,本地时区偏移被忽略,结果就掉回 Unix 起始时间——1970-01-01。
必须先转成有效时间戳再喂给 date():
- 用
strtotime('2023-04-01 10:30:00')(简单但对格式敏感) - 或更稳妥地用
DateTime::createFromFormat('Y-m-d H:i:s', $str)->getTimestamp() - 若已用
now()辅助函数,它已适配$config['time_reference'],可直接传给date()
standard_date() 传字符串就静默失败?
是的。standard_date() 第二个参数必须是整型时间戳,传字符串(如 '2023-04-01')不会报错,而是直接返回 false,容易漏掉调试。
正确用法只有两种:
standard_date('DATE_RFC822', strtotime('2023-04-01'))-
standard_date('DATE_ATOM', now())(now()返回的就是时间戳)
注意:standard_date() 只支持固定常量(如 DATE_W3C、DATE_ATOM),不接受自定义格式字符串,别试图传 'Y-m-d' 这类。
PHP 8.1+ 下 DateTime 对象不能直接传给 date()?
对。PHP 8.1 加强了类型检查,date('Y-m-d', new DateTime()) 会抛 Fatal error: Uncaught TypeError,不再是旧版的隐式转换。
必须显式提取时间戳:
- 错误写法:
date('Y-m-d', $dt)($dt是DateTime实例) - 正确写法:
date('Y-m-d', $dt->getTimestamp()) - CI3 项目升级 PHP 版本前,得全局搜索所有
date(调用,重点检查第二个参数是不是对象
自定义 format_date() 辅助函数怎么防崩?
很多人封装时直接套 date(),上线后一遇到 NULL 或非法格式就 Warning 报错。关键防御点就三个:
- 开头加
if (empty($timestamp)) return '';(别用is_null(),要兼容0和空字符串) - 优先用
DateTime::createFromFormat()解析输入,比strtotime()更可控(例如能区分'2023/04/01'和'2023-04-01') - 时区别硬编码,要么读
date_default_timezone_get(),要么允许传$timezone参数,默认 fallback 到 CI 配置
CI4 已弃用整个 date_helper,改用 CodeIgniter\I18n\Time,但 CI3 项目里这些坑现在还真实存在——尤其数据库字段为 NULL 时,strtotime(NULL) 返回 false,再喂给 date() 就触发警告。


















