PHP 避坑之下月第一天

| 选择喜欢的代码风格  

PHP 日期代码示例:


php -a
Interactive shell

php > echo date("Y-m-01", strtotime("2025-03-31 +1  month"));
2025-05-01
php >
 

“错误” 结果的原因分析:


  • 当前日期是 2025-03-31(3月有31天)
  • strtotime("+1 month") 会尝试在当前日期的"日"部分(31日)上加一个月
  • 但4月只有30天,没有31日,这时 PHP 会“溢出”到5月1日(相当于4月30日+1天)
  • 然后你用 date("Y-m-01") 格式化,取的是5月的第1天 ...

 

安全的获取下月第一天的方式:


$next_month = date("Y-m-01", strtotime("first day of next month"));
// 或
$next_month = date("Y-m-01", strtotime("+1 month first day of this month"));
 

结果验证:


// 在2025-03-31运行时:
echo date("Y-m-d", strtotime("+1 month")); // 输出 2025-05-01
echo date("Y-m-d", strtotime("last day of next month"));  // 输出 2025-04-30
echo date("Y-m-d", strtotime("first day of next month")); // 输出 2025-04-01
 

同理,获取某个月(下月)最后一天的安全方式:


echo date("Y-m-d", strtotime("last day of next month"));  // 输出 2025-04-30

以下是一个 PHP 函数,它可以安全的,根据传入的日期部分格式返回该月份的最后一天:

<?php
function getLastDayOfMonth($partialDate) {
    // 检查传入的日期格式是否符合要求(YYYY-MM)
    if (!preg_match('/^\d{4}-\d{2}$/', $partialDate)) {
        throw new InvalidArgumentException('日期格式不正确,请使用YYYY-MM格式');
    }
    
    // 将部分日期补全为当月的第一天
    $firstDayOfMonth = $partialDate . '-01';
    
    // 创建DateTime对象
    $date = new DateTime($firstDayOfMonth);
    
    // 将日期设置为下个月的第一天
    $date->modify('first day of next month');
    
    // 然后减去一天,得到当前月的最后一天
    $date->modify('-1 day');
    
    // 返回格式化的日期字符串(YYYY-MM-DD)
    return $date->format('Y-m-d');
}

// 示例用法
echo getLastDayOfMonth('2025-06'); // 输出: 2025-06-30
echo getLastDayOfMonth('2025-02'); // 输出: 2025-02-28
echo getLastDayOfMonth('2024-02'); // 输出: 2024-02-29(闰年)
 

CommandNotFound ⚡️ 坑否 - 其他频道扩展阅读:




发表评论