PHP获取指定年月当月天数及日期数组的实现方法

听雨眠
听雨眠
发布时间:2026-10-13 | 5人浏览过
原创

在使用 PHP 进行日历应用、数据报表或定时任务开发时,经常需要根据指定的年月动态获取当月的天数。本文将提供一个实用的自定义函数,不仅能自动识别平年和闰年的二月天数,还能直接生成从1号到月底的完整日期数组,解决手动硬编码日期带来的维护问题。

基础逻辑:判断月份天数与闰年

在实现功能前,我们需要明确不同月份天数的分布规则:

  • 大月(1, 3, 5, 7, 8, 10, 12月):固定为 31 天。
  • 小月(4, 6, 9, 11月):固定为 30 天。
  • 二月(2月):平年为 28 天,闰年为 29 天。

闰年的判断标准是:年份能被 400 整除,或者能被 4 整除但不能被 100 整除。

代码实现:通用日期函数

下面是一个封装好的 PHP 函数 get_day。它接收两个参数:
- $date:输入的标准日期格式字符串,如 '2016-8-1'。
- $rtype:返回值类型,'1' 表示返回天数,'2' 表示返回日期数组。

/**
* 获取当月天数或日期数组
* @param string $date 输入日期,格式如 '2016-8-1'
* @param string $rtype 返回类型: '1' 返回天数, '2' 返回日期数组
* @return mixed int|string array
*/
function get_day($date, $rtype = '1') {
    // 解析输入日期,提取年份和月份
    $tem = explode('-', $date);
    $year = $tem['0'];
    $month = $tem['1'];

    // 初始化默认天数变量
    $days = 0;

    // 定义大月列表
    $big_months = array(1, 3, 5, 7, 8, 10, 12);

    if (in_array($month, $big_months)) {
        // 大月固定31天
        $days = 31;
    } elseif ($month == 2) {
        // 特殊处理二月闰年情况
        // 条件1: 能被400整除
        // 条件2: 能被4整除 且 不能被100整除
        if ($year % 400 == 0 || ($year % 4 == 0 && $year % 100 !== 0)) {
            $days = 29; // 闰年
        } else {
            $days = 28; // 平年
        }
    } else {
        // 小月固定30天
        $days = 30;
    }

    // 根据类型返回结果
    if ($rtype == '2') {
        // 如果要求返回日期数组,则循环生成
        $result_array = array();
        for ($i = 1; $i <= $days; $i++) {
            // 格式化输出为 YYYY-M-D 或保持原样,此处拼接为 YYYY-M-D
            $result_array[] = $year . "-" . $month . "-" . $i;
        }
        return $result_array;
    } else {
        // 否则直接返回天数整数
        return $days;
    }
}

// 测试用例1:获取天数
echo get_day('2016-8-1'); 
// 输出: 31

// 测试用例2:获取日期数组
var_dump(get_day('2016-8-1', '2'));

第1步:解析输入日期字符串

使用 explode('-' , $date) 将传入的日期按横杠拆分。例如输入 '2016-8-1',拆分后得到数组 ['2016', '8', '1']。分别赋值给 $year 和 $month 作为后续逻辑的判断依据。注意月份可能带有前导零(如 01),PHP 在进行数值比较时会自动转换。

第2步:判断月份天数

利用 in_array() 检查月份是否属于大月(1, 3, 5...)。如果是,直接赋值为 31。如果不是大月且是 2 月,则进入闰年判断逻辑。闰年判断采用逻辑或运算:$year%400 == 0 || ($year%4 == 0 && $year%100 !== 0)。满足任一条件即为闰年(29天),否则为平年(28天)。其余月份默认为 30 天。

第3步:生成日期数组(可选)

当 $rtype 参数设为 '2' 时,函数会执行一个 for 循环,从 1 遍历到 $days。每次循环将年份、月份和当前日期数字拼接成字符串,加入结果数组。最终返回形如 ['2016-8-1', '2016-8-2', ...] 的索引数组。

常见问题排错

  • 日期格式不一致:该函数依赖于 explode('-') 切分,请确保输入格式为 YYYY-M-D。如果月份不足两位(如 8 而不是 08),代码中的 in_array 仅匹配了数字,未匹配 '08' 这种字符串形式可能导致误判。建议在解析时使用 intval($tem['1']) 强制转换为整数,以确保逻辑严谨性。
  • 闰年边界值:注意 1900 年虽然能被 4 整除,但能被 100 整除且不能被 400 整除,因此不是闰年。代码中的逻辑 $year%100 !== 0 正确剔除了这种情况。

总结

通过上述自定义函数,开发者可以在 PHP 项目中轻松应对任何月份的日期统计需求。该方案不依赖外部库,纯原生实现,性能高效。以上就是PHP根据年月获取当月天数及日期数组的详细内容,更多关于PHP日期处理技巧的资料请关注本站其它相关文章!

相关标签:

本站声明

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

Python 相关产品和应用

全部下载

专题列表