PHP 日期和时间

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 版本兼容性和服务器环境配置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值