PHP获取指定日期所在周和月的起止时间代码实现

不晚
不晚
发布时间:2026-10-14| 6人浏览过
原创

本文介绍如何利用PHP内置的日期函数获取指定日期所在星期和月份的开始与结束时间,包含核心算法代码及常见时间段筛选的应用场景。

核心功能实现原理

在处理日志、报表或数据筛选时,确定一个时间区间(如“本周”、“本月”)是基础需求。PHP标准库提供了足够灵活的字符串解析和时间戳处理能力来实现这一目标,无需引入第三方包。

第1步:计算星期的开始与结束时间

目的: 根据传入的日期,返回该星期一00:00:00到星期日23:59:59的时间字符串。

入口参数: $date,格式为 'Y-m-d' 或 strtotime可识别的日期格式。

关键步骤:

  1. 使用 strtotime($date) 将输入日期转换为Unix时间戳。
  2. 使用 strftime('%u', $timestamp) 获取该日期的星期几数值(1-7,其中1代表周一,7代表周日)。注意:这与 %w(0-6,周日为0)不同,此处采用ISO 8601标准的周一至周日。
  3. 计算起始时间:$timestamp - ($w - 1) * 86400,即向前偏移天数乘以每天秒数。
  4. 计算结束时间:$timestamp + (7 - $w) * 86400,即向后偏移至周日。
// 获取指定日期所在星期的开始时间与结束时间
function getWeekRange($date){
    $ret = array();
    $timestamp = strtotime($date);
    $w = strftime('%u', $timestamp); // %u 1=Monday, 7=Sunday
    
    // 设置周一00:00:00
    $ret['sdate'] = date('Y-m-d 00:00:00', $timestamp - ($w - 1) * 86400);
    // 设置周日23:59:59
    $ret['edate'] = date('Y-m-d 23:59:59', $timestamp + (7 - $w) * 86400);
    
    return $ret;
}

第2步:计算月份的开始与结束时间

目的: 根据传入的日期,返回该月1号00:00:00到月末最后一秒的时间字符串。

入口参数: $date,同上。

关键步骤:

  1. 获取时间戳后,利用 date('t', $timestamp) 直接获取该月份的天数(28-31天),这比手动计算闰年更准确且简洁。
  2. 起始日期固定为该月1号: 'Y-m-1'。
  3. 结束日期为当月最后一天:'Y-m-' . $mdays。
// 获取指定日期所在月的开始日期与结束日期
function getMonthRange($date){
    $ret = array();
    $timestamp = strtotime($date);
    $mdays = date('t', $timestamp); // 获取当月天数
    
    // 设置1号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;
}

第3步:应用示例——常见时间段筛选器

在实际业务中,通常需要将数字索引映射为具体的时间区间。以下代码展示了如何结合上述两个函数,构建一个通用的时间过滤器 getFilter($n)。

操作说明: 根据不同配置项 $n,返回对应的起止时间数组。

  • n=1: 昨天(独立处理,因为跨月时直接减一天即可,无需调用range函数复杂化)。
  • n=2: 本星期,传入 date('Y-m-d') 获取当天然后套用周逻辑。
  • n=3/4: 上一周/上上上周,先使用 strtotime('-1 week') 计算出基准日期,再代入周计算函数。
  • n=5/6: 本月/上月,逻辑同理,先定位基准日期再套用月计算函数。
// 以上两个函数的应用示例
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;
}

注意事项与排错

时区问题: strftime 和部分 date 行为受服务器时区影响。建议在脚本开头添加 date_default_timezone_set('Asia/Shanghai'); 以确保输出符合预期。

性能考量: 对于高频调用的场景(如每毫秒级计数),字符串转换开销较大。但在常规Web请求中,此方法的性能损耗可忽略不计,代码可读性优于复杂的数学运算。

简要总结

通过 strftime('%u') 确定周首尾,结合 date('t') 获取月末天数,可以极简地解决PHP中的周期时间范围查询问题。这种基于时间戳加减偏移量的方式灵活且兼容性好,适用于各类后台统计系统。

以上就是PHP获取指定日期所在周和月的起止时间代码实现的详细内容,更多关于PHP日期处理技巧的资料请关注本站其它相关文章!
相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。