date() 的基本用法
date() 把时间戳格式化为可读字符串,第二个参数省略时使用当前时间:
echo date(‘Y-m-d H:i:s’); // 2024-05-20 14:30:00
echo date(‘Y-m-d’, 1700000000); // 指定时间戳
第一个参数是格式字符串,只有格式字符会被替换,其余字符原样输出;但遇到有特殊含义的字母(如 t、a、e)需要转义,用反斜杠:
echo date(‘Y年m月d日 l’); // l 被替换为星期
echo date(‘\\t\\o\\d\\a\\y’); // 输出字面量 today
常用格式字符速查
Y四位年份,y两位年份m两位月份(01–12),n不补零(1–12)d两位日期,j不补零H24 小时制,h12 小时制,i分钟,s秒w星期数字(0 为周日),NISO 星期(1 为周一)t当月天数,L是否闰年UUnix 时间戳
选择补零还是非补零,直接影响输出是否符合前端或数据库的预期,例如 2024-5-1 与 2024-05-01 在排序和比较时行为不同。
时间戳与 strtotime
strtotime() 把日期字符串转为时间戳,两者常配合使用:
$ts = strtotime(‘2024-05-20 14:30:00’);
echo date(‘Y/m/d’, $ts);
echo date(‘Y-m-d’, strtotime(‘+7 days’)); // 一周后
echo date(‘Y-m-d’, strtotime(‘last day of this month’));
strtotime() 对无法解析的字符串返回 false,直接传给 date() 会被当作 0,输出 1970 年。稳妥做法是先判断:
$ts = strtotime($input);
if ($ts === false) {
// 处理解析失败
}
时区:最容易踩的坑
date() 使用 PHP 配置的默认时区。若 php.ini 未设置 date.timezone,PHP 会给出警告并使用 UTC,导致输出与本地时间相差数小时。推荐在项目入口显式设置:
datedefaulttimezone_set(‘Asia/Shanghai’);
需要处理多时区时,用 DateTime 与 DateTimeZone 更清晰,也避免全局状态被意外修改:
$dt = new DateTime(‘now’, new DateTimeZone(‘Asia/Shanghai’));
echo $dt->format(‘Y-m-d H:i:s’);
几个实用细节
大小写敏感。 M 是英文月份缩写(May),F 是完整月份(May),D 是星期缩写,A 是 AM/PM,a 是 am/pm。写错大小写常导致输出不符合预期。
不要用 date() 做日期运算。 月末加减、跨年计算用 DateTime::modify() 或 strtotime() 更可靠,手动拼时间戳容易在闰年和月末出错。
区分格式化与解析。 date() 只负责输出,解析输入日期应使用 DateTime::createFromFormat(),它能严格校验格式并返回 false 表示失败,比 strtotime() 宽松解析更适合处理用户输入。
小结
掌握 date() 的关键在于记牢格式字符、显式设置时区、并养成校验 strtotime() 返回值的习惯。复杂场景优先使用 DateTime 系列类,代码的可读性和正确性都会更好。