strtotime 返回 false 的主因是日期字符串格式非法或含不可见字符;需检查是否为空白、是否符合支持格式(如 y-m-d)、避免中文/本地化名称,并用 datetime 辅助诊断。

strtotime 返回 false,通常是因为传入的日期字符串格式不被识别或存在语法错误。核心排查方向是验证输入是否合法、是否符合 strtotime 支持的格式规范。
检查日期字符串是否为空或仅含空白字符
空字符串、null、false 或纯空格都会导致 strtotime 返回 false。
- 用 trim($date) === '' 判断是否为空白
- 用 var_dump($date) 确认原始值类型和内容,避免意外的换行符或不可见字符(如 \u{FEFF} BOM)
- 示例:var_dump(" 2024-01-01");(中文全角空格开头)也会失败
确认日期格式是否在 strtotime 支持范围内
strtotime 不支持任意自定义格式,只识别常见自然语言表达和部分 ISO 格式。
- ✅ 支持:2024-01-01、Jan 1, 2024、next Monday、+1 week
- ❌ 不支持:2024/01/01(部分系统可能成功,但非标准,不推荐)、01-01-2024(易被误判为美式,且无分隔符保障时更危险)、2024年1月1日(中文字符直接失败)
- 建议:优先使用 Y-m-d 或 c(ISO 8601)格式;不确定时可用 DateTime::createFromFormat() 显式指定格式
注意时区与系统 locale 设置干扰
某些非英文 locale(如 setlocale(LC_TIME, 'zh_CN'))可能导致月份/星期名解析失败;时区异常也可能间接影响解析逻辑(尤其含相对时间词时)。
- 临时重置 locale:setlocale(LC_TIME, 'C');
- 检查当前默认时区:date_default_timezone_get(),确保已通过 date_default_timezone_set('Asia/Shanghai') 正确设置
- 避免依赖本地化名称,改用英文缩写(如 Jan 而非 一月)
用 DateTime 构造器辅助诊断
DateTime 的构造行为更明确,报错信息更直观,适合定位问题根源。
- 尝试:$dt = new DateTime($date);,若失败会抛出 Exception,消息中常提示具体哪部分无法解析
- 对比:DateTime::createFromFormat('Y-m-d', $date) 可强制按指定格式解析,返回 false 表示格式完全不匹配,便于快速验证
- 小技巧:对可疑字符串先用 preg_replace('/[^\x20-\x7E]/', '?', $date) 过滤非 ASCII 字符,看是否含隐藏符号
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











