3个实用的PHP日期处理函数

洛溪
洛溪
发布时间:2026-10-13 | 6人浏览过
原创

在日常开发中经常需要处理日期范围筛选,如按天、周、月统计数据。这里整理了三个关键的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日期计算的技巧请持续关注本站!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表