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 week、next Monday、first 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 也同样处理。📖 小节
abs/ceil/floor/round/max/min/pow/sqrt最常用的数学函数mt_rand()随机数(快且随机),random_int()安全随机date("Y-m-d H:i:s")格式化日期时间strtotime()人类语言 → 时间戳,非常灵活DateTime类处理复杂日期计算(diff/modify/compare)- 时区必须设置:
date_default_timezone_set("Asia/Shanghai")
📝 作业
- 用
date()输出三种不同格式的当前时间:年-月-日、中文年月日、带星期的完整格式。 - 写一个函数
getDaysBetween($date1, $date2),用 DateTime 计算两个日期之间相差多少天。 - 写一个函数
isWeekend($date),判断某个日期是否是周末(周六或周日)。