PHP 日期和时间基础
PHP 提供了丰富的日期和时间处理功能,主要通过 date()
函数和 DateTime
类实现。date()
函数用于格式化本地日期和时间,其基本语法如下:
echo date('Y-m-d H:i:s'); // 输出当前日期和时间,例如:2023-10-05 14:30:45
常见格式化参数:
Y
:4 位年份(如 2023)m
:2 位月份(01 到 12)d
:2 位日期(01 到 31)H
:24 小时制小时(00 到 23)i
:分钟(00 到 59)s
:秒(00 到 59)
时区设置
处理日期和时间时,时区设置至关重要。可以通过 date_default_timezone_set()
函数设置时区:
date_default_timezone_set('Asia/Shanghai'); // 设置为上海时区
echo date('Y-m-d H:i:s'); // 输出当前上海时间
支持的时区列表可通过 DateTimeZone::listIdentifiers()
获取:
print_r(DateTimeZone::listIdentifiers());
时间戳操作
时间戳是自 Unix 纪元(1970-01-01 00:00:00 UTC)以来的秒数。time()
函数返回当前时间戳:
echo time(); // 输出当前时间戳,如 1696509045
strtotime()
函数将英文文本日期描述解析为时间戳:
echo strtotime('next Monday'); // 输出下周一的时间戳
echo strtotime('+1 day'); // 输出明天的时间戳
DateTime 类的高级用法
DateTime
类提供了更面向对象的日期和时间操作方式。创建 DateTime
对象:
$date = new DateTime(); // 当前日期和时间
echo $date->format('Y-m-d H:i:s');
修改日期和时间:
$date = new DateTime('2023-10-05');
$date->modify('+1 day'); // 增加一天
echo $date->format('Y-m-d'); // 输出 2023-10-06
计算日期差异:
$date1 = new DateTime('2023-10-05');
$date2 = new DateTime('2023-10-10');
$interval = $date1->diff($date2);
echo $interval->days; // 输出 5
日期比较
比较两个日期可以使用比较运算符或 DateTime
方法:
$date1 = new DateTime('2023-10-05');
$date2 = new DateTime('2023-10-10');
if ($date1 < $date2) {
echo 'date1 早于 date2';
}
本地化日期输出
使用 strftime()
函数可以输出本地化的日期格式(注意:PHP 8.1 后此函数可能被移除,推荐使用 IntlDateFormatter
):
setlocale(LC_TIME, 'zh_CN.utf8');
echo strftime('%Y年%m月%d日'); // 输出:2023年10月05日
替代方案(使用 IntlDateFormatter):
$formatter = new IntlDateFormatter(
'zh_CN',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'Asia/Shanghai',
IntlDateFormatter::GREGORIAN,
'yyyy年MM月dd日'
);
echo $formatter->format(time());
工作日和节假日计算
判断某天是否为工作日:
$date = new DateTime('2023-10-05');
$weekday = $date->format('N'); // 1(周一)到 7(周日)
if ($weekday <= 5) {
echo '工作日';
} else {
echo '周末';
}
计算节假日需要自定义逻辑或使用第三方库,例如:
function isHoliday($date) {
$holidays = ['2023-10-01', '2023-10-02']; // 假设的节假日列表
return in_array($date->format('Y-m-d'), $holidays);
}
日期周期和重复事件
DatePeriod
类可以处理日期周期:
$start = new DateTime('2023-10-01');
$interval = new DateInterval('P1D'); // 1 天间隔
$end = new DateTime('2023-10-05');
$period = new DatePeriod($start, $interval, $end);
foreach ($period as $date) {
echo $date->format('Y-m-d') . "\n";
}
输出:
2023-10-01
2023-10-02
2023-10-03
2023-10-04
微秒和时间精度
获取当前时间包括微秒:
$microtime = microtime(true); // 返回当前 Unix 时间戳和微秒数
echo $microtime;
高精度计时:
$start = microtime(true);
// 执行一些代码
$end = microtime(true);
$elapsed = $end - $start;
echo "执行时间:$elapsed 秒";
常见日期问题解决方案
计算年龄:
$birthday = new DateTime('1990-05-15');
$today = new DateTime();
$age = $today->diff($birthday)->y;
echo "年龄:$age 岁";
获取月份的最后一天:
$date = new DateTime('2023-02-01');
$lastDay = $date->format('t'); // 28 或 29(闰年)
echo "2 月有 $lastDay 天";
闰年判断:
$year = 2024;
$isLeap = (($year % 4 == 0) && ($year % 100 != 0)) || ($year % 400 == 0);
echo $isLeap ? '闰年' : '平年';
日期验证
检查日期是否有效:
$date = '2023-02-30';
if (DateTime::createFromFormat('Y-m-d', $date) !== false) {
echo '有效日期';
} else {
echo '无效日期';
}
国际化日历支持
处理不同日历系统(如农历):
// 需要安装 ext-intl 扩展
$calendar = IntlCalendar::fromDateTime('2023-10-05', 'Asia/Shanghai');
echo IntlDateFormatter::formatObject($calendar, 'yyyy MM dd', 'zh_CN');
注意:以上代码示例假设运行环境为 PHP 7.0+,部分功能可能需要特定扩展(如 ext-intl)。实际使用时应注意 PHP 版本兼容性和服务器环境配置。