strtotime() 本身不区分大小写,可直接解析“jan 1 2024”等格式;但时区和 locale 设置(如 LC_TIME)会影响识别,稳妥做法是统一用 strtolower() 预处理输入。

PHP strtotime() 本身就不区分大小写
直接用 strtotime() 解析类似 "jan 1 2024"、"JAN 1 2024" 或 "Jan 1 2024" 都能正常返回时间戳,无需额外配置或转换。PHP 内部对月份名、星期名等英文关键词做了大小写不敏感处理。
但要注意:时区和语言环境会影响解析结果
如果遇到看似“大小写导致失败”的情况,大概率是时区或 LC_TIME 环境设置干扰了识别,而非大小写本身问题:
-
strtotime()默认使用系统时区(可通过date_default_timezone_set()显式设置) - 在非 C locale 下(比如设置了
setlocale(LC_TIME, 'zh_CN.UTF-8')),部分英文缩写可能无法识别,哪怕大小写正确 - 某些极简嵌入式环境(如 Alpine + musl libc)可能缺失 locale 数据,导致
"feb"被忽略,但"Feb"有时反而能过——这不是大小写逻辑,而是 locale 实现差异
稳妥做法:统一预处理输入字符串
如果你接收的是用户自由输入(如表单、日志字段),建议主动转成小写再解析,避免 locale 带来的不确定性:
function safeStrtotime($input) {
$normalized = strtolower((string)$input);
return strtotime($normalized);
}
// 示例
var_dump(safeStrtotime("FEB 29 2024")); // int(1709136000)
var_dump(safeStrtotime("feb 29 2024")); // 同样 int(1709136000)
注意:strtolower() 对 UTF-8 字符串安全,但若输入含非 ASCII 字符(如中文日期“二月二十九日”),strtotime() 本身不支持,需另配中文解析逻辑。
立即学习“PHP免费学习笔记(深入)”;
别踩坑:不要用 mb_strtolower() 替代 strtolower()
strtotime() 只认 ASCII 英文关键词(jan, mon, am 等)。用 mb_strtolower() 处理纯英文字符串没有坏处,但也没必要;若误传了带 BOM 或编码异常的字符串,反而可能引入空格或不可见字符,导致解析失败。
真正容易被忽略的是:strtotime() 在失败时返回 false,而 false 转为整数是 0,对应 Unix 纪元时间 "1970-01-01" —— 这个静默错误比大小写问题更难排查。











