3个实用的PHP日期处理函数
在日常开发中经常需要处理日期范围筛选,如按天、周、月统计数据。这里整理了三个关键的PHP函数,分别用于生成某月的日历数组、获取当月及当周的起止时间戳,并封装成一个通用筛选工具。
生成某月日历列表
此函数根据传入的日期(如 '2015-09-25'),生成一个二维数组,键为星期索引(0~6),值为该日期的天数。这对于前端渲染标准日历表格非常有用。
第1步:初始化参数并计算基本数值
首先需要确定目标月份的第一天是星期几,以及该月总共有多少天:
$month_date = '2015-09-25';
$start_time = strtotime($month_date);
$start_week = date('w', $start_time); // 当月第一天是星期几 (0-6)
$total_month_day = date('t', $start_time); // 当月总天数
$weeks_in_month = ceil(($start_week+$total_month_day)/7); // 当月需要的行数
第2步:填充数组数据结构
使用双重循环遍历行数和列数(星期)。逻辑核心在于判断当前是首行还是尾行,以及是否已经填完当月所有天数:
$month_day_arr = [];
$start_month_day = 1;
for($i=0; $i<$weeks_in_month; $i++) {
for($j=0; $j<7; $j++){
if($i ==0 && $j >= $start_week) {
// 如果是第一行且列号大于等于月初星期偏移量
$month_day_arr[$i][$j] = $start_month_day;
$start_month_day++;
} elseif($i == 0) {
// 第一行未到达起始星期的位置留空
$month_day_arr[$i][$j] = '';
} else {
// 后续行正常填入日期
$month_day_arr[$i][$j] = $start_month_day;
$start_month_day++;
}
// 当日期超过当月总天数时,跳出内层循环
if($start_month_day > $total_month_day){
break;
}
}
}
第3步:输出结果验证
打印生成的数组,可以看到结构符合预期,前导空白和最后剩余的空位已被正确标记为空字符串:
echo "<pre>";
print_r($month_day_arr);
/* 输出示例: Array(
[0] => Array ([0] => , [1] => , [2] => 1... ),
... )*/
获取日期所在范围(当月/当周)
在处理后台查询时,通常需要“开始日期”和“结束日期”。下面两个函数分别解决月范围和周范围的问题。
第1步:封装获取月度范围函数
利用 strtotime() 定位到本月1号和月底最后一天。注意 date('t') 可以自动处理闰年等月份天数差异:
function getMonthRange($date){
$ret=array();
$timestamp=strtotime($date);
$mdays=date('t',$timestamp);
// 设定起始时间为 00:00:00
$ret['sdate']=date('Y-m-1 00:00:00',$timestamp);
// 设定结束时间为 23:59:59
$ret['edate']=date('Y-m-'.$mdays.' 23:59:59',$timestamp);
return $ret;
}
第2步:封装获取周度范围函数
使用 %u 格式符获取ISO-8601标准的星期数字(周一为1,周日为7)。以此为基准向前向后推算秒数即可:
function getWeekRange($date){
$ret=array();
$timestamp=strtotime($date);
$w=strftime('%u',$timestamp); // 获取星期几
// 减去(当前星期-1)天得到周一,加(7-当前星期+1)天得到周日跨度修正
$ret['sdate']=date('Y-m-d 00:00:00',$timestamp-($w-1)*86400);
$ret['edate']=date('Y-m-d 23:59:59',$timestamp+(7-$w)*86400);
return $ret;
}
综合应用:时间范围筛选器
将上述函数结合 strtotime 的时间推移功能,可以构建一个通用的筛选入口。例如:strtotime('-1 day') 表示昨天。
第1步:编写统一的 switch-case 接口
通过整数参数 $n 区分不同的时间段,返回对应的起止时间数组:
function getFilter($n){
$ret=array();
switch($n){
case 1: // 昨天
$ret['sdate']=date('Y-m-d 00:00:00',strtotime('-1 day'));
$ret['edate']=date('Y-m-d 23:59:59',strtotime('-1 day'));
break;
case 2: // 本星期
$ret=getWeekRange(date('Y-m-d'));
break;
case 3: // 上一个星期
$strDate=date('Y-m-d',strtotime('-1 week'));
$ret=getWeekRange($strDate);
break;
case 4: // 上上星期
$strDate=date('Y-m-d',strtotime('-2 week'));
$ret=getWeekRange($strDate);
break;
case 5: // 本月
$ret=getMonthRange(date('Y-m-d'));
break;
case 6: // 上月
$strDate=date('Y-m-d',strtotime('-1 month'));
$ret=getMonthRange($strDate);
break;
}
return $ret;
}
以上就是这3个实用PHP日历与日期范围处理函数的详细内容,更多关于PHP日期计算的技巧请持续关注本站!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













