PHP Date
Date function reference: format, parse, timestamps, timezones.
Key PointsUse `DateTime` in new code; the procedural API appears mostly in legacy.
Function overview
| Function | Purpose | Example |
|---|---|---|
| date | 格式化时间戳 | date("Y-m-d") |
| time | 当前时间戳 | 1700000000 |
| mktime | 由时分秒月日年造时间戳 | mktime(0,0,0,11,15,2023) |
| strtotime | 解析时间描述 | strtotime("+1 day") |
| checkdate | 日期是否真实存在 | checkdate(2,30,2023) → false |
| date_diff | 两个日期之差 | 返回 DateInterval |
| date_add | 日期加区间 | date_add($d, $i) |
| getdate | 拆成关联数组 | ["year"]、["mon"] |
Examples
PHP
<?php
date_default_timezone_set("Asia/Shanghai");
$ts = mktime(0, 0, 0, 11, 15, 2023);
echo $ts, "\n";
echo date("Y-m-d H:i:s", $ts), "\n";
echo date("Y-m-d", strtotime("+7 days", $ts)), "\n";
var_dump(checkdate(2, 30, 2023));
var_dump(checkdate(2, 29, 2024));
$d = getdate($ts);
echo $d["year"] . "-" . $d["mon"] . "-" . $d["mday"], "\n";
echo $d["weekday"], "\n";Output
1700006400
2023-11-15 00:00:00
2023-11-22
bool(false)
bool(true)
2023-11-15
Wednesdaymktime takes hour, minute, second, month, day, year — not year-first. The most commonly misremembered argument order in PHP.
Date difference
PHP
<?php
$a = new DateTime("2023-11-15");
$b = new DateTime("2024-02-20");
$diff = $a->diff($b);
echo $diff->days, "\n";
echo $diff->format("%y 年 %m 月 %d 天"), "\n";
echo $diff->invert, "\n";
$d2 = $b->diff($a);
echo $d2->invert, "\n";Output
97
0 年 3 月 5 天
0
1invert is 1 when the result is negative (the second date precedes the first). **Never judge order from days** — it is always positive.
Timestamp boundaries
PHP
<?php
date_default_timezone_set("Asia/Shanghai");
// 当天零点与次日零点
$today = strtotime("today");
$tomorrow = strtotime("tomorrow");
echo date("Y-m-d H:i:s", $today), "\n";
echo date("Y-m-d H:i:s", $tomorrow), "\n";
echo ($tomorrow - $today) / 3600, "\n";
// 本月最后一天
echo date("Y-m-t", $today), "\n";
// 本周一
echo date("Y-m-d", strtotime("monday this week", $today)), "\n";Output
2023-11-15 00:00:00
2023-11-16 00:00:00
24
2023-11-30
2023-11-13On DST transitions tomorrow-minus-today is not 24 hours. China has no DST, but multi-timezone systems must not assume 86400 seconds per day.
函数一览
| 函数 | 作用 | 示例 |
|---|---|---|
| date | 格式化时间戳 | date("Y-m-d") |
| time | 当前时间戳 | 1700000000 |
| mktime | 由时分秒月日年造时间戳 | mktime(0,0,0,11,15,2023) |
| strtotime | 解析时间描述 | strtotime("+1 day") |
| checkdate | 日期是否真实存在 | checkdate(2,30,2023) → false |
| date_diff | 两个日期之差 | 返回 DateInterval |
| date_add | 日期加区间 | date_add($d, $i) |
| getdate | 拆成关联数组 | ["year"]、["mon"] |
常用示例
PHP
<?php
date_default_timezone_set("Asia/Shanghai");
$ts = mktime(0, 0, 0, 11, 15, 2023);
echo $ts, "\n";
echo date("Y-m-d H:i:s", $ts), "\n";
echo date("Y-m-d", strtotime("+7 days", $ts)), "\n";
var_dump(checkdate(2, 30, 2023));
var_dump(checkdate(2, 29, 2024));
$d = getdate($ts);
echo $d["year"] . "-" . $d["mon"] . "-" . $d["mday"], "\n";
echo $d["weekday"], "\n";Output
1700006400
2023-11-15 00:00:00
2023-11-22
bool(false)
bool(true)
2023-11-15
Wednesdaymktime 的参数顺序是 时 分 秒 月 日 年,不是「年月日」。这是 PHP 里最容易记错的参数顺序之一,用 DateTime 可以完全避开。
日期差
PHP
<?php
$a = new DateTime("2023-11-15");
$b = new DateTime("2024-02-20");
$diff = $a->diff($b);
echo $diff->days, "\n";
echo $diff->format("%y 年 %m 月 %d 天"), "\n";
echo $diff->invert, "\n";
$d2 = $b->diff($a);
echo $d2->invert, "\n";Output
97
0 年 3 月 5 天
0
1invert 是 1 表示「结果是负数」(即第二个日期比第一个早)。**判断先后不能只看 days**,那个永远是正数。
时间戳边界
PHP
<?php
date_default_timezone_set("Asia/Shanghai");
// 当天零点与次日零点
$today = strtotime("today");
$tomorrow = strtotime("tomorrow");
echo date("Y-m-d H:i:s", $today), "\n";
echo date("Y-m-d H:i:s", $tomorrow), "\n";
echo ($tomorrow - $today) / 3600, "\n";
// 本月最后一天
echo date("Y-m-t", $today), "\n";
// 本周一
echo date("Y-m-d", strtotime("monday this week", $today)), "\n";Output
2023-11-15 00:00:00
2023-11-16 00:00:00
24
2023-11-30
2023-11-13夏令时切换那天「明天零点减今天零点」不等于 24 小时。中国不用夏令时,但面向多时区的系统不能假设一天等于 86400 秒。