date()函数需用特定字母组合格式化时间,如"Y-m-d"输出"2024-03-15";第二参数必须为时间戳,中文描述需配合setlocale和strftime;时区须显式设置,如date_default_timezone_set("Asia/Shanghai")。

date() 函数怎么写对格式字符串
PHP 的 date() 不是“按中文意思拼”,而是靠一串特定字母组合控制输出。比如想输出「2024-03-15」,不能写 date("yyyy-mm-dd")——这会原样输出字符串,不是解析;得用 date("Y-m-d"),其中 Y 是4位年份、m 是带前导零的月、d 是带前导零的日。
常见错误现象:date("y-m-d") 输出「24-03-15」(两位年份),date("Y-n-j") 输出「2024-3-15」(无前导零);还有人误用 date("H:i:s A") 得到「14:30:45 PM」——A 要求 12 小时制,但 H 是 24 小时制,冲突导致 AM/PM 永远是 AM。
-
Y(4位年)≠y(2位年),m(01–12)≠n(1–12),d(01–31)≠j(1–31) - 12 小时制必须配
g或h,不能混用H+A - 空格、横线、冒号等分隔符直接写在引号里,不加转义(除非是
\本身) - 要输出字面量如 “第” 或 “周”,得用反斜杠转义:
date("Y年m月d日 \周\l")→ 「2024年03月15日 周五」
time() 和 strtotime() 传参搞错就全乱了
date() 第二个参数是时间戳,不是日期字符串。直接传 "2024-03-15" 会当成 0,结果永远是 1970-01-01。必须先用 strtotime() 转成时间戳,或用 time() 取当前时间戳。
使用场景:处理用户提交的日期表单、计算相对时间(如“三天后”)、读取数据库里的 DATETIME 字段。
立即学习“PHP免费学习笔记(深入)”;
- 正确:
date("Y-m-d", strtotime("2024-03-15")) - 错误:
date("Y-m-d", "2024-03-15")→ 输出 1970-01-01 -
strtotime("next Monday")可用,但strtotime("下周一")在默认 locale 下无效(需设setlocale(LC_TIME, 'zh_CN')并配合strftime(),date()不支持中文描述) - 注意时区:
strtotime()默认按服务器时区解析,如果传入带时区的字符串如"2024-03-15T10:00:00+08:00",它能识别;但"2024-03-15 10:00:00"会被当作本地时区
时区不设,线上和本地结果可能不一样
PHP 默认用系统时区(通常是 UTC 或服务器所在地),但开发机和生产机时区不同,date() 输出就会差好几个小时。不是 bug,是没显式声明意图。
性能影响几乎为零,但兼容性极关键:尤其涉及定时任务、日志时间、用户会话过期判断时,错一小时可能导致逻辑跳变。
- 最稳做法:在脚本开头统一设时区,
date_default_timezone_set("Asia/Shanghai") - 别用
"PRC"或"Etc/GMT-8"这类过时或反直觉的标识(Etc/GMT-8实际是 UTC+8,命名是反的) - 查可用时区:
timezone_identifiers_list(),别凭记忆写 - 如果项目已用
DateTime类,时区应在对象创建时指定,date()函数本身不感知对象时区
替代方案:DateTime 更可靠,但 date() 并没过时
很多人听说 DateTime 更现代,就弃用 date(),其实没必要。对简单格式化、无时区切换、无复杂运算的场景,date() 更轻、更快、更直白。
容易踩的坑是强行把 DateTime 和 date() 混用:比如用 new DateTime() 创建对象后,又去调 date("Y-m-d", $dt->getTimestamp())——多此一举,直接 $dt->format("Y-m-d") 更清晰。
- 用
date():适合模板里快速输出、配置项默认值、日志打点 - 用
DateTime:需要加减天数、比较两个时间、跨时区转换、从非标准格式解析(如 RFC2822) -
date()不支持微秒,DateTime::format()也不支持(得用u格式符,且 PHP ≥ 7.1) - 如果只是改一个地方的格式,别为了“用新语法”而重构整块逻辑











