PHP日期时间处理学习笔记

对于初学者来说,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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值