对于初学者来说,PHP的日期时间处理显得不太友好,有点烧脑。它提供了很多种处理日期和时间的方式,包括函数式编程和面向对象两种风格。我专门从网上收集整理了PHP中涉及日期时间处理的各项核心知识,作为学习笔记。
一、基础日期时间函数
1. date()函数
date()是PHP中最基础的日期格式化函数,它将时间戳转换为可读的日期字符串。
echo date('Y-m-d'); // 输出当前日期,如2025-07-13
echo date('Y-m-d H:i:s'); // 输出当前日期和时间,如2025-07-13 15:30:45
常用格式字符:
Y:4位年份
m:2位月份(01-12)
d:2位日期(01-31)
H:24小时制小时(00-23)
i:分钟(00-59)
s:秒(00-59)
2. time()函数
time()返回当前Unix时间戳(自1970年1月1日以来的秒数)
$timestamp = time(); // 获取当前时间戳
3. strtotime()函数
strtotime()将英文文本日期时间描述解析为Unix时间戳
echo strtotime("2025-07-13"); // 输出指定日期的时间戳
echo strtotime("+1 week"); // 输出一周后的时间戳
注意:strtotime()会自动修正无效日期,比如2月31日,它会自作主张变更为3月3号,这种容错太坑人了。
二、面向对象的DateTime类
PHP 5.2+引入了更强大的DateTime类,提供了更面向对象的方式来处理日期时间
1. 创建DateTime对象
$now = new DateTime(); // 当前时间
$specificDate = new DateTime('2025-07-13');
$withTime = new DateTime('2025-07-13 15:30:00');
2. DateTime::createFromFormat()
按指定格式解析日期字符串
$date = DateTime::createFromFormat('Y-m-d', '2025-07-13');
3. 格式化输出
使用format()方法格式化DateTime对象
echo $date->format('Y-m-d H:i:s');
4. 日期时间计算
DateTime类支持日期时间的加减运算
$date = new DateTime();
$date->add(new DateInterval('P1D')); // 加1天
$date->sub(new DateInterval('P1M')); // 减1个月
5. 时区处理
DateTime可以处理时区转换
$date = new DateTime('now', new DateTimeZone('Asia/Shanghai'));
echo $date->format('Y-m-d H:i:s');
三、其他重要日期时间函数
1. mktime()
根据给定的日期时间参数生成时间戳
$timestamp = mktime(15, 30, 0, 7, 13, 2025);
2. getdate()
返回包含日期时间信息的关联数组
$dateInfo = getdate();
print_r($dateInfo);
3. checkdate()
验证日期的有效性(比strtotime严格)
var_dump(checkdate(2, 31, 2025)); // 返回false,2月没有31天
4. date_diff()
计算两个日期之间的差异
$date1 = new DateTime('2025-07-13');
$date2 = new DateTime('2025-08-15');
$interval = date_diff($date1, $date2);
echo $interval->format('%R%a days'); // 输出+33 days
四、日期时间格式详解
PHP使用特定字符表示日期时间格式:
1. 年相关格式
Y:4位年份(如2025)
y:2位年份(如25)
o:ISO-8601年份数字
2. 月相关格式
m:2位月份(01-12)
M:3字母月份缩写(Jan-Dec)
n:无前导零月份(1-12)
F:完整月份名称(January-December)
3. 日相关格式
d:2位日期(01-31)
j:无前导零日期(1-31)
S:英文序数后缀(st, nd, rd或th)
z:一年中的第几天(0-365)
4. 时间相关格式
H:24小时制(00-23)
h:12小时制(01-12)
i:分钟(00-59)
s:秒(00-59)
a:小写上午/下午(am/pm)
A:大写上午/下午(AM/PM)
5. 预定义常量
PHP还提供了一些预定义日期格式常量:
DATE_ATOM:Atom格式(如2025-07-13T15:30:45+00:00)
DATE_RFC822:RFC822格式(如Mon, 13 Jul 25 15:30:45 +0000)
DATE_RFC3339:RFC3339格式(如2025-07-13T15:30:45+00:00)
五、最佳实践与常见问题
1. 时区设置
始终在脚本开始时设置时区
date_default_timezone_set('Asia/Shanghai');
2. 日期验证
不要依赖strtotime()验证日期,使用checkdate()或DateTime::createFromFormat()
3. 2038年问题
32位系统上,时间戳在2038年1月19日会溢出,使用DateTime类避免此问题
4. 性能考虑
对于简单操作,函数式(date(), time())比面向对象(DateTime)更快;复杂操作则相反
5. 多语言支持
使用strftime()进行本地化日期格式化(但PHP8+已弃用)
六、实用代码示例
1. 获取当前季度
function getCurrentQuarter() {
$month = date('n');
return ceil($month / 3);
}
2. 计算年龄
function calculateAge($birthDate) {
$birth = new DateTime($birthDate);
$now = new DateTime();
$interval = $now->diff($birth);
return $interval->y;
}
3. 获取某月最后一天
function getLastDayOfMonth($year, $month) {
$date = new DateTime("$year-$month-01");
$date->modify('last day of this month');
return $date->format('Y-m-d');
}
4. 工作日计算
function addBusinessDays($startDate, $daysToAdd) {
$date = new DateTime($startDate);
$count = 0;
while ($count < $daysToAdd) {
$date->add(new DateInterval('P1D'));
if ($date->format('N')
此外,还有“now、today、week、yesterday、tomorrow”等标识符。比如:
$today = (new DateTime('today'))->format('Y-m-d'); // 输出:2025-07-13