不能。strtotime() 不支持中文日期字符串,仅识别英文关键词和标准格式;中文需预处理(如 str_replace)或改用 DateTime::createFromFormat() 显式匹配。

false。
它只识别英文关键词(如 today、next Monday、+2 days)和标准格式(如 Y-m-d H:i:s、2024-03-15 15:00:00)。中文字符会被当作无效内容跳过或导致整体解析失败。
为什么有人觉得“能”?
因为部分人先用 str_replace() 把 `"年"` `"月"` `"日"` 换成 `-` 和空字符串,再传给 strtotime(),看起来“成功了”——其实是预处理起作用,不是 strtotime() 本身支持中文。
strtotime("2024年03月15日") 返回 false 怎么办
这不是函数坏了,是它本来就不该处理这种格式。别硬调,改用更可控的方式:- 用
str_replace(['年','月','日'], ['-', '-', ''], $input)得到"2024-03-15",再传给strtotime() - 更推荐:用
DateTime::createFromFormat('Y年n月j日', $input),它明确按模板匹配,不猜、不妥协 - 若含汉字数字(如 `"二〇二四年三月十五日"`),得先映射替换:
strtr($input, ['零'=>'0','一'=>'1','二'=>'2','〇'=>'0']),再清理分隔符 - 避免在循环里反复调用,尤其批量处理时;
DateTime::createFromFormat()比strtotime()快 3–5 倍
strtotime("今天下午3点") 解析失败的根源
strtotime() 根本不识别 `"下午3点"` 这种中文时间描述。它的自然语言解析仅限英文短语,比如 "3pm" 或 "15:00"。
常见错误操作:
- 直接传
"今天下午3点"→ 返回false,后续date('Y-m-d', false)输出1970-01-01 - 用
mb_convert_encoding()转编码 → 没用,问题不在编码,在语义不支持 - 设
setlocale(LC_TIME, 'zh_CN')→ 对strtotime()无效,它不走 locale 逻辑
DateTime::createFromFormat 也解析不了中文单位?
是的,DateTime::createFromFormat() 同样不认 `"年"` `"月"` `"日"` 这些汉字,它们不是合法的格式字符。
但你可以这样写:
-
DateTime::createFromFormat('Y年m月d日', '2024年03月15日')—— ✅ 可行,前提是格式字符与字符串完全对应 -
DateTime::createFromFormat('Y-m-d', str_replace(['年','月','日'], ['-','-',''], $input))—— ✅ 更通用 -
DateTime::createFromFormat('Y年n月j日 H:i', '2024年3月5日 14:30')—— ✅ 支持不补零的月/日 - 但
DateTime::createFromFormat('Y年m月d日', '2024年03月5日')→ ❌ 失败,因为d要求两位数,而 `"5"` 是一位
false,否则静默失败。
真正难处理的不是“怎么转”,而是“为什么上次行、这次不行”——strtotime() 的行为高度依赖上下文(当前时间、时区、PHP 版本),而中文字符串又自带歧义(“下周三”指哪天?“下午3点”是 15:00 还是 15:00:00?)。
宁可多写两行预处理,也别指望它自动理解中文。



















