PHP中优雅获取本月、上月和下月起止日期的方法

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

在PHP开发中,准确获取当前、上月及下月的第一天和最后一天是常见的业务需求。传统手动判断月份长度(如28、29、30或31天)不仅代码冗长,且容易遗漏闰年或跨年边界情况。利用PHP内置的时间戳函数 strtotime() 和格式化函数 date() 的智能解析特性,可以以极简的代码逻辑自动完成复杂的日期推算。

核心原理与优势

PHP的 strtotime() 函数具备强大的相对时间解析能力。它不仅能识别标准日期格式,还能处理非自然存在的时间描述(例如“某月-0-1”会被自动修正为上个月的最后一天,“某月+1个月”会自动进位到下一年)。结合 date('Y-m-d')

获取本月起止日期

要获取给定日期所在月份的第一天和最后一天,可以采用“定位月初 + 偏移量”的策略:

  1. 获取首日:将输入日期的日部分强制替换为 01,即可获得当月第一天。
  2. 获取末日基于首日增加1个月,再减去1天。例如2月的第一天加1个月是3月1日,再减1天即为2月最后一天(自动处理平年/闰年)。
复制代码 代码如下:
function getMonth($date){
    // 获取当月第一天:直接将日期置为01
    $firstday = date("Y-m-01", strtotime($date));
    
    // 获取当月最后一天:先加一个月变成次月1号,再减一天
    $lastday = date("Y-m-d", strtotime("$firstday +1 month -1 day"));
    
    return array($firstday, $lastday);
}

// 示例:输入 2014-02-15
// $firstday 结果为 "2014-02-01"
// $lastday 结果为 "2014-02-28"

获取上月起止日期

获取上个月数据时,关键在于处理跨年场景。PHP的 date()

  • 构造上月初日:提取输入日期的年份,将月份数减1,拼接成 YYYY-MM-01 字符串,再通过 strtotime 解析。
  • 推导上月末日:同样利用“次日月初减一天”的逻辑。
  • 复制代码 代码如下:
    function getlastMonthDays($date){
        $timestamp = strtotime($date);
        
        // 智能处理跨年:如果当前是1月,date('Y-0-01')会自动变为去年12月
        $firstday = date('Y-m-01', strtotime(date('Y', $timestamp) . '-' . (date('m', $timestamp) - 1) . '-01'));
        
        // 上月最后一天即下月(当月)第一天的前一天
        $lastday = date('Y-m-d', strtotime("$firstday +1 month -1 day"));
        
        return array($firstday, $lastday);
    }
    
    // 注意:此方法利用了PHP日期解析器的容错性,无需额外编写if-else判断月份是否为1
    

    获取下月起止日期

    与上月不同,PHP的 strtotime()

  • 判断当前月份:若当前为12月,次年即为今年+1,月份变为1;否则月份直接+1。
  • 格式化日期:根据年份和计算出的月份组合成新的日期字符串。
  • 计算末日:沿用“加一月减一天”的模式。
  • 复制代码 代码如下:
    function getNextMonthDays($date){
        $timestamp = strtotime($date);
        $arr = getdate($timestamp);
        
        if ($arr['mon'] == 12) {
            // 处理12月跨年情况
            $year = $arr['year'] + 1;
            $month = '01'; // 下年1月
            $firstday = "$year-$month-01";
        } else {
            // 其他月份正常加1
            $nextMon = str_pad($arr['mon'] + 1, 2, '0', STR_PAD_LEFT); // 补零处理,如 1 -> 01
            $firstday = date('Y-' . $nextMon . '-01', $timestamp);
        }
        
        $lastday = date('Y-m-d', strtotime("$firstday +1 month -1 day"));
        
        return array($firstday, $lastday);
    }
    
    // 示例优化:也可以使用 strtotime 的相对语法简化,但需确保输入格式规范
    // $nextFirstDay = date('Y-m-01', strtotime(date('Y-m-01', $timestamp) . ' +1 month'));
    

    总结

    通过上述三种场景的实现可见,充分利用 strtotime() 对相对时间的解析能力以及 date() 的格式化功能,可以避免大量硬编码的条件判断。特别是在处理月底日期时,“次日月初减一天”是一个通用且不易出错的高效技巧。以上就是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 算法库。