
PHP用date()输出YYYYMMDD格式最简写法
直接用 date('Ymd'),这是唯一推荐的写法。Y(4位年)、m(补零月)、d(补零日)连起来就是紧凑的8位数字,不带分隔符、无空格、无时区干扰。
- 别用
date('Y-m-d')再去 str_replace,多一次字符串操作,没必要 - 别拼接
$year.$month.$day,要自己处理补零(比如1月变01),容易漏逻辑 - 注意:
date()默认用当前时区,如果服务器时区不是你期望的(比如UTC但你要北京时间),得先date_default_timezone_set('Asia/Shanghai')
strtotime()解析字符串后转YYYYMMDD要防错
从用户输入或数据库读到类似 "2024-05-20" 或 "2024/05/20" 的字符串,想转成 20240520,不能直接 date('Ymd', strtotime($str)) 就完事。
- 如果 $str 是空、null、非法格式(如
"2024-13-01"),strtotime()返回 false,date()会输出 19700101(Unix epoch)——这是最常踩的坑 - 务必加判断:
$ts = strtotime($str); echo $ts === false ? 'invalid date' : date('Ymd', $ts); - 中文日期(如
"2024年5月20日")strtotime()不识别,得先正则清理或换DateTime::createFromFormat()
MySQL里DATE字段转PHP YYYYMMDD别绕路
查出的 created_at 是 2024-05-20 这种字符串,或者 PDO fetch 出来是 DateTime 对象,都别用 substr() 截取。
- 如果是字符串,直接
str_replace('-', '', $row['created_at'])最快,没函数调用开销 - 如果是
DateTime对象,用$dt->format('Ymd'),比date('Ymd', $dt->getTimestamp())更准(避免时区转换误差) - 注意PDO默认把DATE转成字符串,除非你设了
PDO::ATTR_EMULATE_PREPARES => false并启用PDO::ATTR_STRINGIFY_FETCHES => false,否则拿不到原生 DateTime
strftime()在PHP 8.1+已废弃,别再用
strftime('%Y%m%d', $ts) 看似能用,但它依赖系统 locale,行为不稳定,且 PHP 8.1 起彻底移除。现在所有环境都该切到 date() 或 DateTime::format()。
立即学习“PHP免费学习笔记(深入)”;
- 比如 locale 设为
zh_CN.UTF-8时,某些旧系统strftime()会把 %Y 解成两位年(’24’),而非四位 - Windows 下
strftime()对某些格式符支持不全,%Y可能返回空 - 升级 PHP 后如果代码里还有
strftime(),会报Deprecated: strftime(): Passing null to parameter #2 ($timestamp) of type int is deprecated类错误
真正麻烦的是跨时区场景下,你以为 date('Ymd') 输出的是“当天”,其实它按服务器时区算——比如服务器在 UTC,你在北京,凌晨0点刚过,date('Ymd') 还是昨天的日期。这个点不显式设时区,几乎必错。











