写 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() 算时间差