首页 / PHP 入门教程 / PHP 日期与时间

PHP 入门教程

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
H24小时制14
i分钟30
s00
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() 函数」等,改写后所得。