PHP 入门教程
28.1
28.2
28.3
28.4
PHP 日期与时间
本教程共 65 篇 · 第 28 篇 · 更新于 2026-07-24 · 约 5 分钟阅读
PHPPHP8日期时间DateTime时区时间戳
28. PHP 日期与时间
本节目标:掌握
date()、strtotime()的用法,学会使用DateTime类处理复杂时间运算。
日期时间是 Web 开发的高频需求:文章发布时间、倒计时、会员有效期等。PHP 提供了函数和面向对象两套方案。
28.1 date() 格式化日期
date() 将时间戳格式化为可读字符串:
<?php
echo date("Y-m-d H:i:s"); // 2026-07-24 14:30:00
echo date("Y年m月d日"); // 2026年07月24日
echo date("l"); // Thursday(星期几英文)
常用格式字符
| 字符 | 含义 | 示例 |
|---|---|---|
Y | 四位年份 | 2026 |
m | 两位月份 | 07 |
d | 两位日期 | 24 |
H | 24小时制 | 14 |
i | 分钟 | 30 |
s | 秒 | 00 |
w | 星期数字 | 0(周日)到 6 |
指定时间戳
<?php
$timestamp = strtotime("2026-08-08 20:00:00");
echo date("Y-m-d H:i:s", $timestamp);
28.2 strtotime() 自然语言解析
strtotime() 能把英文描述转为时间戳:
<?php
echo strtotime("now"); // 当前时间戳
echo strtotime("+1 day"); // 明天此时
echo strtotime("+1 week"); // 一周后
echo strtotime("-3 months"); // 三个月前
echo strtotime("next Monday"); // 下周一
echo strtotime("2026-12-25"); // 指定日期
结合 date() 做日期运算:
<?php
$nextWeek = date("Y-m-d", strtotime("+7 days"));
echo "一周后是:{$nextWeek}";
$firstDayNextMonth = date("Y-m-01", strtotime("+1 month"));
echo "下月第一天:{$firstDayNextMonth}";
Tip
strtotime("+1 month")在月末时会有”溢出”行为(如 1月31日 +1个月 = 3月3日)。需要精确月份运算时,请用DateTime配合modify("first day of next month")这类相对格式。
28.3 DateTime 类(推荐)
PHP 5.2 引入的 DateTime 类功能更强,是处理复杂时间的首选。
创建与格式化
<?php
$now = new DateTime(); // 当前时间
$birth = new DateTime("1995-05-15"); // 指定时间
// 格式化输出
echo $now->format("Y-m-d H:i:s");
echo $now->format("l, F j, Y"); // Thursday, July 24, 2026
时间运算
<?php
$date = new DateTime("2026-01-31");
// 注意:modify("+1 month") 与 strtotime 一样会溢出
// 2026-01-31 +1 month = 2026-03-03(非 02-28)
// 要安全地获取下个月,用以下方式:
$date->modify("first day of next month");
echo $date->format("Y-m-d"); // 2026-02-01
// 也可以用 add 方法配合 DateInterval
$date->add(new DateInterval("P10D")); // 加 10 天
$date->sub(new DateInterval("P2M")); // 减 2 个月
Note
DateInterval构造参数以P开头,后面跟数字和单位:P1Y2M3DT4H5M6S表示 1年2月3日4时5分6秒。
计算时间差
<?php
$start = new DateTime("2026-07-24 09:00:00");
$end = new DateTime("2026-07-24 18:30:00");
$diff = $start->diff($end);
echo $diff->format("%H 小时 %i 分钟"); // 09 小时 30 分钟
echo $diff->days; // 总天数差
28.4 DatePeriod 遍历日期区间
需要生成一系列连续日期时,DatePeriod 非常方便:
<?php
$start = new DateTime("2026-07-01");
$end = new DateTime("2026-07-10");
$interval = new DateInterval("P1D"); // 每天
$period = new DatePeriod($start, $interval, $end);
foreach ($period as $date) {
echo $date->format("Y-m-d l") . "\n";
}
28.5 时区处理
PHP 默认使用服务器时区,建议显式设置:
<?php
// 设置默认时区
date_default_timezone_set("Asia/Shanghai");
// 或在 DateTime 中指定时区
$utc = new DateTime("now", new DateTimeZone("UTC"));
$tokyo = new DateTime("now", new DateTimeZone("Asia/Tokyo"));
echo $utc->format("H:i:s"); // UTC 时间
echo $tokyo->format("H:i:s"); // 东京时间
// 转换时区
$utc->setTimezone(new DateTimeZone("Asia/Shanghai"));
echo $utc->format("Y-m-d H:i:s");
Tip数据库存储推荐用 UTC,展示时转为用户本地时区,避免夏令时等问题。
28.6 获取时间戳
<?php
echo time(); // 当前 Unix 时间戳(秒)
echo microtime(true); // 带微秒的时间戳(浮点数)
// DateTime 转时间戳
$dt = new DateTime();
echo $dt->getTimestamp();
来源:参考了 runoob「PHP 日期」、w3cschool「PHP 日期」「PHP date() 函数」等,改写后所得。