PHP: 数学与日期

计算折扣、统计报表、显示"发布于3天前"、生成订单号——数学和日期是每个 Web 应用都离不开的基础操作。

1. 常用数学函数

PHP
<?php
// 基础运算
echo abs(-5);             // 5(绝对值)
echo ceil(3.14);          // 4(向上取整)
echo floor(3.99);         // 3(向下取整)
echo round(3.5);          // 4(四舍五入,.5 往偶数取)
echo round(3.14159, 2);   // 3.14(保留2位小数)

// 极值
echo max(3, 7, 2, 9);     // 9(最大值)
echo min(3, 7, 2, 9);     // 2(最小值)
echo max([5, 3, 9, 1]);   // 9(数组也可以)

// 幂和根
echo pow(2, 3);           // 8(2的3次方)
echo sqrt(16);            // 4(平方根)

// 随机数
echo rand(1, 100);        // 1到100之间的随机整数
echo mt_rand(1, 1000);    // 高精度随机数(推荐)
echo random_int(1, 10);   // 密码学安全随机数(PHP 7+)
?>
💡 提示: 普通随机用 mt_rand()(比 rand() 快4倍且更随机)。密码/Token 等安全敏感场景用 random_int()(密码学安全)。


2. date() 函数

date() 是 PHP 中最常用的日期函数,通过格式字符串输出日期:

PHP
<?php
// 当前日期时间
echo date("Y-m-d");             // 2026-06-29
echo date("Y年m月d日");          // 2026年06月29日
echo date("H:i:s");             // 14:30:45
echo date("Y-m-d H:i:s");       // 2026-06-29 14:30:45

// 星期
echo date("l");                 // Monday(完整星期名)
echo date("w");                 // 1(星期数,0=周日)
?>

(1) 常用格式字符

字符 含义 示例
Y 四位年份 2026
y 两位年份 26
m 月份(补零) 06
n 月份(不补零) 6
d 日期(补零) 09
j 日期(不补零) 9
H 24小时制(补零) 14
i 分钟(补零) 30
s 秒(补零) 45

▶ 示例:时间戳转换

PHP
<?php
// time():当前 Unix 时间戳(1970年1月1日起的秒数)
$now = time();
echo $now;  // 类似 1751101234

// date() 的第二个参数是时间戳
echo date("Y-m-d H:i:s", $now);

// strtotime():人类可读的日期 → 时间戳
$ts = strtotime("2026-01-01 00:00:00");
echo date("Y年m月d日", $ts);  // 2026年01月01日

// strtotime 非常智能
echo date("Y-m-d", strtotime("+1 week"));     // 一周后
echo date("Y-m-d", strtotime("next Monday")); // 下周一
echo date("Y-m-d", strtotime("last day of this month")); // 本月最后一天
echo date("Y-m-d", strtotime("+3 months"));   // 三个月后
?>
▶ 试一试
💡 提示: strtotime() 非常灵活,能理解 +1 weeknext Mondayfirst day of next month 等自然语言。但不要过度依赖——对于复杂的日期计算,用 DateTime 类。


3. DateTime 类

date()strtotime() 足够简单场景。复杂场景用 DateTime 类,面向对象,能力更强:

PHP
<?php
// 创建 DateTime 对象
$now = new DateTime();
$specific = new DateTime("2026-06-01 09:00:00");
$fromFormat = DateTime::createFromFormat("d/m/Y", "15/08/2026");

// 格式化输出
echo $now->format("Y-m-d H:i:s");

// 日期加减
$future = new DateTime();
$future->modify("+2 weeks");
$future->modify("+3 days");
echo $future->format("Y-m-d");  // 今天 + 17天

// 计算差值
$birthday = new DateTime("2000-01-15");
$today = new DateTime();
$diff = $birthday->diff($today);
echo "你已经活了 {$diff->days} 天,{$diff->y} 年";
// diff() 返回 DateInterval 对象,有 y/m/d/h/i/s/days 属性
?>

▶ 示例:日期比较与区间

PHP
<?php
$start = new DateTime("2026-06-01");
$end   = new DateTime("2026-06-30");

// 比较日期
if ($start < $end) {
    echo "开始日期在结束日期之前";
}

// 遍历日期区间
$period = new DateInterval("P7D");     // 7天间隔
$dates = new DatePeriod($start, $period, $end);
foreach ($dates as $date) {
    echo $date->format("m-d") . " ";
}
// 输出:06-01 06-08 06-15 06-22 06-29
?>
▶ 试一试

4. 时区设置

PHP
<?php
// 设置时区(在文件开头设置一次即可)
date_default_timezone_set("Asia/Shanghai");

echo date("Y-m-d H:i:s");  // 使用上海时区的时间

// 查看当前时区
echo date_default_timezone_get();  // Asia/Shanghai

// 常用时区:
// Asia/Shanghai  - 北京时间 (UTC+8)
// Asia/Tokyo     - 东京时间 (UTC+9)
// Asia/Riyadh    - 利雅得时间 (UTC+3)
// America/Sao_Paulo - 圣保罗时间 (UTC-3)
?>
⚠️ 注意: PHP 默认时区是 UTC。如果你的网站在中国,记得在脚本开头调用 date_default_timezone_set("Asia/Shanghai")。否则用户评论会显示 8 小时前的时间。


5. 实战:常见日期场景

PHP
<?php
// 1. 计算年龄
function getAge(string $birthday): int {
    $born = new DateTime($birthday);
    $today = new DateTime();
    return $born->diff($today)->y;
}
echo getAge("2000-01-15");  // 26

// 2. 显示相对时间("发布于3天前")
function timeAgo(string $datetime): string {
    $past = new DateTime($datetime);
    $now = new DateTime();
    $diff = $past->diff($now);

    if ($diff->y > 0)    return $diff->y . "年前";
    if ($diff->m > 0)    return $diff->m . "个月前";
    if ($diff->d > 0)    return $diff->d . "天前";
    if ($diff->h > 0)    return $diff->h . "小时前";
    if ($diff->i > 0)    return $diff->i . "分钟前";
    return "刚刚";
}

// 3. 生成订单号
function generateOrderNo(): string {
    return date("YmdHis") . mt_rand(1000, 9999);
}
echo generateOrderNo();  // 202606291430451234
?>

❓ 常见问题

Q date()DateTime 怎么选?
A 简单格式化用 date()(一行搞定)。需要计算日期差、遍历日期区间、修改日期、比较日期等复杂操作时用 DateTime
Q 为什么我的时间显示比实际多了/少了 8 小时?
A 时区问题。执行 date_default_timezone_set("Asia/Shanghai") 或在 php.ini 中设置 date.timezone = Asia/Shanghai
Q strtotime("2026/02/29") 会返回什么?
A 2026 年 2 月没有 29 天,strtotime 会自动纠正为 2026-03-01。DateTime 也同样处理。

📖 小节

📝 作业

  1. date() 输出三种不同格式的当前时间:年-月-日、中文年月日、带星期的完整格式。
  2. 写一个函数 getDaysBetween($date1, $date2),用 DateTime 计算两个日期之间相差多少天。
  3. 写一个函数 isWeekend($date),判断某个日期是否是周末(周六或周日)。
Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏