strtotime() 是最常用也最稳妥的日期字符串转时间戳方法,能自动识别常见格式,但需显式判断 false;datetime::createfromformat() 更适合固定格式且需精确控制的场景。

strtotime() 是最常用也最稳妥的选择
PHP 里把日期字符串转成时间戳,strtotime() 是默认答案。它能自动识别常见格式(如 "2024-03-15"、"15/03/2024"、"March 15, 2024"),对开发效率友好。
- 如果输入是标准 ISO 格式(
"Y-m-d H:i:s"),比如"2024-03-15 14:30:00",strtotime()几乎不会出错 - 遇到模糊格式(如
"03/15/2024"),它按系统 locale 解析:美国环境认作month/day/year,欧洲可能报错或误判 - 返回值是整型时间戳;失败时返回
false,必须显式判断,不能只用if (strtotime($str))(因为1970-01-01 00:00:00也会返回 0)
if (($ts = strtotime($dateStr)) === false) {
throw new InvalidArgumentException("Invalid date format: $dateStr");
}
DateTime::createFromFormat() 更适合固定格式的日期
当你明确知道输入格式(比如日志里全是 "d/m/Y H:i"),用 DateTime::createFromFormat() 更可靠、更可控。
- 它不依赖 locale,也不做猜测,完全按你给的格式解析
- 解析失败时返回
null,不是false,注意空值检查 - 支持宽松模式(
DateTime::createFromFormat('!d/m/Y', $str)中的!会重置时间为 00:00:00)
$dt = DateTime::createFromFormat('d/m/Y H:i', '15/03/2024 14:30');
if (!$dt || $dt->format('d/m/Y H:i') !== '15/03/2024 14:30') {
// 格式不匹配或解析失败
}
别直接用 time() 或 date() 混淆概念
time() 返回当前时间戳,和“转换”无关;date() 是把时间戳转回字符串——这两个函数常被误当作转换入口。
- 把
date('U', strtotime($str))当作“双重保险”?没必要,strtotime()已经返回时间戳了 - 用
mktime()手动拼年月日?仅当已有分离的整数变量(如$year, $month, $day)才适用,且要注意月份从 1 开始,不是 0 -
gettimeofday()、microtime()返回的是带微秒的浮点数,不是标准 Unix 时间戳,别混用
时区问题最容易被忽略
strtotime() 和 DateTime 默认使用 PHP 配置的时区(date.timezone),但如果你的日期字符串自带时区(如 "2024-03-15T14:30:00+08:00"),它们会自动处理;如果不带,就按默认时区解释。
- 不要假设输入就是本地时间:API 返回的
"2024-03-15"很可能是 UTC,但你的服务器在东八区,直接strtotime()就会多加 8 小时 - 显式指定时区更安全:
$dt = new DateTime($dateStr, new DateTimeZone('UTC')); $ts = $dt->getTimestamp(); -
date_default_timezone_set()全局改时区影响大,建议只在必要时临时设置,或优先用DateTime对象绑定时区
真正麻烦的从来不是“怎么写”,而是“哪个字符串来自哪、有没有时区、格式是否稳定”。写完记得用边界值测:空字符串、2月30日、1970年前、超长年份。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











