写 Web 应用几乎离不开时间:文章的发布时间、用户的注册时间、活动的倒计时。这篇带你掌握 PHP 处理日期时间的三把工具:date()、strtotime() 和 DateTime 类。
一、time() 与 date():取当前时间并格式化
PHP 里时间戳是自 1970-01-01 00:00:00 以来的秒数:
<?php
echo time(); // 输出:例如 1769415600(当前 Unix 时间戳)
echo date('Y-m-d H:i:s'); // 输出:例如 2026-09-26 14:30:00
date() 的第一个参数是格式字符串,常用占位符:
| 占位符 | 含义 | 示例 |
|---|---|---|
| Y | 4 位年份 | 2026 |
| m | 月份(补零) | 09 |
| d | 日(补零) | 26 |
| H | 24 小时制小时 | 14 |
| i | 分钟 | 30 |
| s | 秒 | 05 |
| N | 星期几(1=周一) | 6 |
组合起来:date('Y年m月d日') 输出"2026年09月26日"。
二、时区很重要
时区不对,时间会差好几个小时。脚本开头先设置时区:
<?php
date_default_timezone_set('Asia/Shanghai');
echo date('H:i:s'); // 输出:北京时间
三、strtotime():把"人话"变成时间戳
strtotime 能解析各种日期描述,算"未来某天"特别方便:
<?php
echo strtotime('2026-10-01'); // 输出:该日期的时间戳
echo date('Y-m-d', strtotime('+7 days')); // 输出:7 天后的日期
echo date('Y-m-d', strtotime('next monday')); // 输出:下周一的日期
echo date('Y-m-d', strtotime('-1 month')); // 输出:1 个月前的日期
+7 days、next monday、-1 month 这类相对描述都是合法写法。
四、mktime() 与 checkdate():构造与校验日期
<?php
$ts = mktime(0, 0, 0, 10, 1, 2026); // 2026-10-01 00:00:00 的时间戳
echo date('Y-m-d', $ts); // 输出:2026-10-01
var_dump(checkdate(2, 29, 2026)); // 输出:bool(false),2026 不是闰年
var_dump(checkdate(2, 29, 2028)); // 输出:bool(true)
校验用户填的日期是否存在(比如生日),用 checkdate 最稳妥。
五、DateTime:面向对象的方式
日期计算多了以后,DateTime 类让代码更清晰:
<?php
$d = new DateTime('2026-10-01');
echo $d->format('Y-m-d'); // 输出:2026-10-01
$d->modify('+3 days');
echo $d->format('Y-m-d'); // 输出:2026-10-04
$d2 = new DateTime('2026-12-31');
$diff = $d->diff($d2);
echo $diff->days; // 输出:88(相差天数)
diff() 返回 DateInterval 对象,days 属性直接给出相差天数,做倒计时、算会员剩余天数都很方便。
六、实战:文章"多久之前发布"
把上面的知识串起来,写一个常见的时间显示函数:
<?php
function timeAgo($ts) {
$diff = time() - $ts;
if ($diff < 60) return '刚刚';
if ($diff < 3600) return floor($diff / 60) . ' 分钟前';
if ($diff < 86400) return floor($diff / 3600) . ' 小时前';
return floor($diff / 86400) . ' 天前';
}
echo timeAgo(strtotime('-2 hours')); // 输出:2 小时前
小结
- time() 取当前时间戳,date() 把时间戳格式化成可读字符串
- 记得 date_default_timezone_set() 设置时区,否则时间可能不对
- strtotime() 擅长解析相对时间描述,算"几天后"很方便
- 复杂计算用 DateTime:modify() 推移日期,diff() 算时间差
评论 0
还没有评论,来抢沙发吧~ 🛋