在PHP开发中,日期时间的处理是很多业务场景的必备需求,比如订单创建时间记录、用户登录时间统计、活动有效期判断等,date函数作为PHP内置的日期处理函数,是完成这些操作的核心工具。它可以将时间戳转换为指定格式的日期字符串,也支持结合其他日期函数完成更复杂的逻辑。

date函数基本语法
date函数的基本语法格式如下:
<?php /** * date函数基本语法 * @param string $format 日期格式化字符 * @param int|null $timestamp 可选的时间戳,不传则使用当前时间 * @return string 格式化后的日期字符串 */ string date(string $format, ?int $timestamp = null) ?>
如果不传入第二个参数,函数默认使用当前时间的时间戳,也就是time()函数的返回值。
常用格式化字符说明
date函数的第一个参数$format由各类格式化字符组成,不同的字符代表不同的时间维度,常用的格式化字符可以分为以下几类:
年相关字符
- Y:四位年份,比如2024
- y:两位年份,比如24
- L:是否为闰年,是则返回1,否则返回0
月相关字符
- m:带前导零的月份,01到12
- n:不带前导零的月份,1到12
- F:完整的月份英文名称,比如January
- M:缩写的月份英文名称,比如Jan
日相关字符
- d:带前导零的日期,01到31
- j:不带前导零的日期,1到31
- l:完整的星期几英文名称,比如Monday
- D:缩写的星期几英文名称,比如Mon
时间相关字符
- H:24小时制带前导零的小时,00到23
- h:12小时制带前导零的小时,01到12
- i:带前导零的分钟,00到59
- s:带前导零的秒数,00到59
- A:大写的上午下午标识,AM或PM
- a:小写的上午下午标识,am或pm
基础使用示例
下面通过几个简单的示例展示date函数的基础用法:
<?php
// 获取当前时间的完整日期时间字符串
echo date('Y-m-d H:i:s'); // 输出类似 2024-05-20 14:30:25
// 获取当前年份和月份
echo date('Y年m月'); // 输出类似 2024年05月
// 获取当前是星期几
echo date('l'); // 输出类似 Monday
// 使用指定时间戳格式化
$timestamp = 1716182400;
echo date('Y-m-d', $timestamp); // 输出 2024-05-20
?>
时区设置技巧
date函数默认使用PHP配置的时区,如果时区设置不正确,获取的时间会和实际本地时间有偏差。可以通过两种方式设置时区:
临时设置时区
在脚本中通过date_default_timezone_set函数临时设置时区,只对当前脚本生效:
<?php
// 设置时区为上海
date_default_timezone_set('Asia/Shanghai');
echo date('Y-m-d H:i:s'); // 输出的时间就是上海本地时间
?>
永久设置时区
修改php.ini配置文件中的date.timezone项,设置为对应的时区值,重启PHP服务后全局生效:
date.timezone = Asia/Shanghai
实用技巧场景
获取指定时间范围
比如获取今天开始和结束的时间戳,或者本月第一天的日期:
<?php
date_default_timezone_set('Asia/Shanghai');
// 今天开始时间
$today_start = date('Y-m-d 00:00:00');
echo $today_start; // 输出类似 2024-05-20 00:00:00
// 今天结束时间
$today_end = date('Y-m-d 23:59:59');
echo $today_end; // 输出类似 2024-05-20 23:59:59
// 本月第一天
$month_first = date('Y-m-01');
echo $month_first; // 输出类似 2024-05-01
// 下个月第一天
$next_month_first = date('Y-m-01', strtotime('+1 month'));
echo $next_month_first; // 输出类似 2024-06-01
?>
计算时间差
结合strtotime函数可以计算两个日期的时间差:
<?php
date_default_timezone_set('Asia/Shanghai');
$start_time = strtotime('2024-05-01 10:00:00');
$end_time = strtotime('2024-05-20 14:30:00');
$diff_seconds = $end_time - $start_time;
// 转换为天、小时、分钟
$days = floor($diff_seconds / 86400);
$hours = floor(($diff_seconds % 86400) / 3600);
$minutes = floor(($diff_seconds % 3600) / 60);
echo "时间差为{$days}天{$hours}小时{$minutes}分钟";
?>
判断日期有效性
可以通过date函数和strtotime函数结合判断输入的日期字符串是否合法:
<?php
function check_date_valid($date_str) {
$timestamp = strtotime($date_str);
if (!$timestamp) {
return false;
}
// 格式化后和原字符串对比,避免strtotime自动修正不合法日期
return date('Y-m-d', $timestamp) == $date_str;
}
var_dump(check_date_valid('2024-02-29')); // 2024是闰年,返回true
var_dump(check_date_valid('2023-02-29')); // 2023不是闰年,返回false
?>
注意事项
- date函数的格式化字符区分大小写,比如
Y和y代表不同的年份格式,使用时不要写错 - 如果传入的时间戳为null,函数会使用当前时间,若传入的时间戳超出范围,可能会返回错误的结果
- 在跨时区业务中,一定要先明确时区设置,避免出现时间偏差导致业务逻辑错误
- 处理历史日期或者未来日期时,可以结合
strtotime函数的相对时间语法,比如+1 day、-3 month等,快速计算目标时间的时间戳