PHP 日期与时间

PHP 提供了丰富的日期时间函数,以及面向对象的 DateTime 类。

基础函数

PHP 实例
// 获取当前时间戳(Unix 时间戳:1970-01-01 起的秒数)
echo time(); // 如:1714000000

// 格式化当前时间 echo date('Y-m-d'); // 2024-01-15 echo date('Y-m-d H:i:s'); // 2024-01-15 14:30:00 echo date('Y年m月d日 H:i'); // 2024年01月15日 14:30 echo date('D, d M Y'); // Mon, 15 Jan 2024 ``

date() 格式字符

字符说明示例
Y四位年份2024
m两位月份01-12
d两位日期01-31
H24小时制小时00-23
i分钟00-59
s00-59
N星期(1=周一)1-7
UUnix 时间戳1714000000

时间戳转换

`php // 字符串转时间戳 $ts = strtotime('2024-06-01'); $ts = strtotime('next Monday'); $ts = strtotime('+7 days'); $ts = strtotime('-1 month');

echo date('Y-m-d', strtotime('+30 days')); // 30天后的日期

// mktime() 创建指定时间的时间戳 $ts = mktime(12, 0, 0, 6, 1, 2024); // 2024-06-01 12:00:00 echo date('Y-m-d H:i:s', $ts); `

DateTime 类(推荐)

`php // 创建 $now = new DateTime(); $date = new DateTime('2024-06-01'); $date = new DateTime('now', new DateTimeZone('Asia/Shanghai'));

// 格式化 echo $now->format('Y-m-d H:i:s');

// 修改 $date->modify('+1 month'); $date->modify('next Friday');

// 设置 $date->setDate(2024, 12, 25); $date->setTime(10, 30, 0); `

日期计算

`php $start = new DateTime('2024-01-01'); $end = new DateTime('2024-12-31');

// 计算差值 $diff = $start->diff($end); echo $diff->days; // 365(总天数) echo $diff->m; // 月数 echo $diff->y; // 年数

// 判断是否过期 $expire = new DateTime('2024-06-01'); $now = new DateTime(); if ($now > $expire) { echo '已过期'; } `

DateTimeImmutable(不可变对象)

`php // DateTime 会修改原对象,DateTimeImmutable 返回新对象 $date = new DateTimeImmutable('2024-01-01'); $newDate = $date->modify('+1 month'); // $date 不变

echo $date->format('Y-m-d'); // 2024-01-01(不变) echo $newDate->format('Y-m-d'); // 2024-02-01 `

时区设置

`php // 全局设置(推荐放在入口文件) date_default_timezone_set('Asia/Shanghai');

echo date('Y-m-d H:i:s'); // 北京时间

// 单独指定时区 $tz = new DateTimeZone('America/New_York'); $date = new DateTime('now', $tz); echo $date->format('Y-m-d H:i:s'); `

实用示例

``php // 计算年龄 function calcAge(string $birthday): int { return (new DateTime($birthday))->diff(new DateTime())->y; } echo calcAge('1995-08-15'); // 28

// 格式化为"多久前" function timeAgo(int $timestamp): string { $diff = time() - $timestamp; if ($diff < 60) return $diff . ' 秒前'; if ($diff < 3600) return floor($diff / 60) . ' 分钟前'; if ($diff < 86400) return floor($diff / 3600) . ' 小时前'; if ($diff < 604800) return floor($diff / 86400) . ' 天前'; return date('Y-m-d', $timestamp); } echo timeAgo(time() - 3600); // 1 小时前